SQL Server Новый столбец добавлен в таблицу, но проблемы с Select * - PullRequest
2 голосов
/ 04 ноября 2010

Утро

У меня есть хранимая процедура, которая возвращает SELECT * из таблицы.

Каждый раз, когда я добавляю новый столбец в таблицу, «SELECT *» часто возвращает некоторые данные в неправильных столбцах.

Это проблема оптимизации или кеширования? Как мне решить эту проблему без необходимости явно определять имена возвращаемых столбцов в моей хранимой процедуре?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 04 ноября 2010

Независимо от точного характера вашей проблемы или ее решения, я бы порекомендовал вам не использовать Select * From Table.Это менее эффективно - каждый раз, когда вы запускаете запрос, в БД отправляется дополнительный запрос, чтобы точно определить, какие столбцы составляют «*», а затем отправляется правильный запрос с конкретной информацией о столбцах.

3 голосов
/ 04 ноября 2010

Причина вашей проблемы, вероятно, зависит от используемого вами стека клиента.

Говоря в очень общих терминах, SQL Server будет возвращать столбцы в порядке их добавления в таблицу, если вы выполните SELECT *. Если в запросе задействовано более одной таблицы, столбцы из каждой таблицы будут возвращаться в порядке их появления в запросе.

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

Это одна из причин, по которой обычно не рекомендуется использовать «SELECT *» в клиентском коде.

1 голос
/ 04 ноября 2010

Лучший способ избежать этой проблемы состоит в том, чтобы хранимая процедура возвращала предопределенный набор столбцов (SELECT a, b вместо SELECT *) и использовала объединение таблиц для получения остальной части кода. Поскольку хранимые процедуры не могут быть частью запроса, вы можете преобразовать хранимую процедуру в табличную пользовательскую функцию n и выполнить соединение с ней:

SELECT f.a, f.b, t.*
FROM dbo.fn_YourFunction('a', 'b') f
INNER JOIN YourTable t ON f.id = t.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...