Имя таблицы переменных в динамическом sql с COALESCE

Я хочу получить столбцы таблицы в переменной в этой форме col1,col2,col3

Поэтому я использовал следующий запрос

SELECT @cols = COALESCE(@cols + ', ', '') + column_name FROM
INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG='mudb' and TABLE_NAME='mytbl'

Я был успешным с выше. Но когда я хочу использовать имя переменной таблицы. У меня проблема. Я старался

SELECT @cols = COALESCE(@cols + ', ', '') + column_name FROM
INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG='mudb' and TABLE_NAME=@tbl

Но это дает нулевой результат. Тогда я стараюсь использовать EXECUTE sp_executesql

set @FullStatement='SELECT @cols = COALESCE(@cols + '', '', '''') +
column_name FROM INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG=''mudb''
and TABLE_NAME=@tbl'

PRINT @FullStatement
EXECUTE sp_executesql @FullStatement

Тогда это дает мне ошибку Must declare the scalar variable "@cols" но @cols объявлен

1 ответ

Решение

@cols может быть объявлено в рамках скрипта, который вы запускаете. Он не объявлен в области динамического SQL. Переменные не наследуются от одного уровня к другому.

Итак, вы хотите передать его в среду выполнения, что вы можете сделать с sp_executesql:

set @FullStatement='SELECT @cols = COALESCE(@cols + '', '', '''') +
column_name FROM INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG=''mudb''
and TABLE_NAME=@tbl'

PRINT @FullStatement
EXECUTE sp_executesql @FullStatement, N'@Cols varchar(8000) output, @Tbl varchar(8000)',
                      @cols = @cols, @tbl = 'MyTable';

Вот как вы получаете оператор execute для работы. Однако этот метод объединения столбцов не будет работать в динамическом SQL.

Другие вопросы по тегам