Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: SELECT 1 vs EXEC('SELECT 1')

Обычно в осадок выпасть мне тяжело, но сегодня это клиенту удалось. Накрутили что-то с правами, что внутри хранимки нельзя использовать динамику EXEC. Обьясните добрые люди в какую сторону копать?

Ибо такой код как оказывается выполнить нельзя:

EXEC('SELECT 1')

Права на базе с которой вызывается динамика: datareader, datawriter, ddladmin.
Исходя из справки права на вызов EXEC: Requires membership in the public role.

По дефолту в ней все юзера.
Ответ:
AlanDenton
Yasha123
остается, что у юзера нет права имперсонэйтить.

Вы правы. Спасибо

а, ну вот и разобрались.
пардон за повторное долбление про IMPERSONATE в предыдущем посте
Вопрос: select union select union select

select union select union select

возможен ли такой запрос. если да как мне это возможно

прошу покат на примерах
Ответ:

К сообщению приложен файл. Размер - 57Kb
Вопрос: select from select

Добрый день. задача стоит в подсчете среднего значения последних 13 записей в таблице dbo.server. Помогите разобраться, не работает:
Select avg(data) as 'avgdata'
from
(select top 13 absolute_number, date
from dbo.server
where absolute_number='11')

отдельно работает:
select top 13 absolute_number, date
from dbo.server
where absolute_number='11')
Ответ:
msLex
alexeyvg
пропущено...
Проблема в том, что надо писать не "ниработает!!!", а копировать сюда из результата текст ошибки, да и по возможности текст запроса тоже.

к сожалению, в случае ошибки, которую допустил автор, сообщение сервера не очень информативно, что-то типа "incorrect syntax near )".
Думаю, в сочетании с текстом запроса этого было бы достаточно, что бы в первом ответе дать правильный совет :-)
Я, по крайней мере, при таком тексте сразу посмотрел бы на наличие алиаса.

Я вообще сразу про алиас подумал, просто посты ТС настолько невнятные, с такими кривыми и синтаксически неправильными конструкциями, что непонятно, в чём дело, и действительно ли текст ошибочного запроса такой, какой выложен здесь.

В общем, общее правило - не нужно пересказывать запросы и ошибки - нужно их просто копировать, в крайнем случае заменяя реальные имена (серверов таблиц etc) на вымышленные, если это нужно. А своими словами нужно описывать бизнес-задачу.
Вопрос: Select * vs Select id

select * from t;
vs
select id from t;


Вопросы:
1) Если два эти запроса выполняются не для получения данных, а для подсчета выбранных строк, то что именно мы теряем, если средний размер ряда 20 Кб, а количество выборки 12 тыс. строк?
2) Памяти больше сжирается? Корректно ли утверждать, что первый запрос требует на 240 Мб больше, чем второй? Чую, что, скорее всего нет, но утверждать что-либо у меня нет оснований.
3) Есть ли у первого запроса из-за звездочки потеря в производительности и если да, то о каких % потерь в скорости идет речь: 5%, 20%, 50%, в 2, 5, 10 раз медленнее?
4) Какие вообще сжираются ресурсы сервером при выполнении select'а до получения самих данных?
Ответ: там ещё много интересного в коментах

автор
Блин, опять запутался: в кеше хранятся данные, по которым производится выборка a like '' && b like '' или в кеше все-таки хранятся результаты выборки и если у нас where id = 5, в то кеше будет хранится вся таблица в которой искалось id = 5 или в кеше будет храниться только одна эта запись?


только одна запись
для хранения первоначальных данных таблицы используется другая память(область)
в этой области хранится вся таблица...
вот эта переменная отвечает
innodb_buffer_pool_size = 512M
первый обращение запроса загружает таблицу в эту память, повторный - уже ищет в ней
Вопрос: select * vs select count(*)

Подскажите, пожалуйста, что должно выполняться быстрее и почему?
select * from MY_TABLE

или
select count(*) from MY_TABLE
Ответ: questioner,

автор
Я ведь могу вам ответить, что алгоритм сортировки пузырьком работает за O(n^2), а quicksort за O(n*log(n))

с козырей пошёл что-ли? А я вязать крючком умею
Вопрос: ASE 15.7: [select * ] vs [select {Column List} ] = [* - win]

Всем доброго...
То ли пятница, то ли...

Есть некоторый тривиальный запрос (джойн 6 таблиц, 1 - Left join)+ ряд условий WHERE.
Ничего криминального и специфичного.

Но вот загадко: если указан
select * from ....

оптимизатор - должным образом все понимает и выбирает нужные индексы и т.п.

Как только задаю список колонок явно (даже просто одно поле одной таблицы t.ID numeric(15)) без изменения структуры джойнов и условий = все.
Оптимизатору сносит мозг. Начинаются повальные TableScan.

При этом речь не идет про LOB и т.п. - тривиальные вполне таблицы по структуре.

С чего бы это? Кто-нибудь сталкивался с подобными граблями?
Ответ:
Mikle83
считаю, что поведение не совсем нормальное


Ладно, переведём вопрос в практическую плоскость.

Ещё раз, такие ситуации являются нормальными и типичными для РСУБД с COST-BASED оптимизатором.
80% запросов оптимизируются нормально, 20% -- мимо кассы, надо шаманить.

Ты ещё какие-то проблемы хочешь решить, кроме этой ?
Вопрос: Select в динамическом запросе и процедура

Добрый день!
Возможно ли как то обойти проблему использования динамического запроса в процедуре, если запрос выдает только табличные данные. У меня вот такой запрос, необходимо вернуть таблицу. Можно конечно попробовать через временную таблицу, но таблицы разные, количество столбцов неизвестно. Возможно ли как исхитриться, что-то отправить в функцию, что-то оставить в процедуре. Подскажите, пожалуйста.
ALTER PROCEDURE [dbo].[Table]
	@Task nvarchar(max),
	@Table nvarchar(max)
AS
BEGIN
	Declare @SQL nvarchar(max)
	Declare @TableID nvarchar(max)
exec sp_executesql 
N'Select @TableID=(Select top(1)ID from _Tables Where Name like @Table AND TaskID=(Select top(1)ID from _Task Where Name=@Task))', 
N'@TableID nvarchar(max) OUTPUT,@Task nvarchar(max),@Table nvarchar(max)',
@TableID OUTPUT,@Task,@Table
Set @SQL='SELECT * FROM ['+ @TableID+']'
exec sp_executesql @SQL
Return
END
Ответ: Про динамические запросы я в курсе. Вопрос был как можно было обойти используя SQL или только программно.
Спасибо всем кто написал по делу.
Вопрос: Запрос с вложенными Select

Здравствуйте. Мне необходимо для таблицы myTable(field_name, field_value, field_date) создать отчёт, который бы выводил построчно field_name (за текущую дату), field_value (за текущую дату), field_value (среднее значение до сегодняшней даты), field_value (за дату год назад).

Возможно ли создать запрос, который бы включал ещё несколько (2) запроса? Хотелось бы ограничится одним отчётом.

Select ....., (select... From....), (select... From....) From....

Пока я могу создать три запроса, три отчёта и выводить их вместе.
Ответ: в том виде что вы хотите сделать вряд ли получится
потому что в разделе select дополнительные select-ы прописать не можно
однако выход есть
в строке select можно использовать функции типа D.....
(конечно не самый лучший вариант, но .....)
теперь конкретно
field_name (за текущую дату) - этот столбец у вас есть
field_value (за текущую дату) - этот столбец у вас есть
field_value (среднее значение до сегодняшней даты) можно заменить на Dsum()/DCount()
field_value (за дату год назад) можно заменить на DLookUp() или DFirst() или DLast()
самое главное разобраться с синтаксисом этих функций (он у всех одинаковый) и правильно прописать условия
примерный текст запроса будет выглядеть так

SQL
1
SELECT field_name, field_value, Dsum()/DCount() AS field_middle, DLookUp() AS field_last_yar FROM myTable
Вопрос: Select в select или другой способ решения

Необходимо написать запрос.
В таблице Info хранится Имя пользователя. Связана таблица с таблицей Users по ID_Users. В таблице Chat. Хранится ID_отправителя (Chat.ID_Users_otp), ID_получателя (Chat.ID_Users_pol) и сообщение (Message).

Вот как вывести Имя того кто написал, Имя того кому написали. И само сообщение.

Пробовал типо:
SQL
1
2
3
4
5
6
7
8
SELECT Info.Value, 
(SELECT Info.Value
FROM Info, Chat, Users
WHERE Users.ID_Users=Chat.ID_Users_pol AND Info.ID_Char=2 AND Users.ID_Users=Info.ID_Users)
 
FROM Info, Chat, Users
WHERE Users.ID_Users=Chat.ID_Users_otp AND Info.ID_Char=2 AND Users.ID_Users=Info.ID_Users
ORDER BY Chat.DateTime
Говорит возвращается несколько записей.

Добавлено через 56 минут
Сделал что б ФИ хранинились в таблице Users, что бы объединять только 2 таблицы

SQL
1
2
3
4
5
6
7
SELECT CONCAT(Users.LastName, ' ', Users.FirstName) AS ФИ, 
(SELECT CONCAT(Users.LastName, ' ', Users.FirstName) AS ФИ
FROM Users,Chat 
WHERE Users.ID_Users = Chat.ID_Users_pol), Chat.Message, Chat.DateTime
FROM Users,Chat 
WHERE Users.ID_Users = Chat.ID_Users_otp
ORDER BY Chat.DateTime
Как исправить этот запрос что бы работал?
Ответ: Спасибо огромное!
Вопрос: INSERT NewID() with SELECT

ПРиветствую!
Собственно задачу я решил, но уверен, что можно проще:
Есть таблица 1 столбец primary key ID c форматом uniqueidentifier без возможности NULL, все остальные varchar без ограничений
надо было вставить данные с другой таблицы SELECTOM делал как:
убрал primary key, разрешил NULL закинул сначала все остальные столбцы, потом UPDATOM запилил NewID()
Можно ли как-то одним запросом(я просто уверен, что можно) это все сделать?
INSERT INTO t1 (ID,b,c,d)
VALUES (NewID(), select lalalalalala, select lalalal, select lalalal Итд итп)
он конечно ругается, что возвращаются несколько значений вместо 1 из-за select
по другому тож ошибки.
В общем вразумите ГУРУ , как такого плана запросы строить?
Ответ: Гавриленко Сергей Алексеевич,

учиться и еще раз учиться:) спасибо!