Вставьте динамический оператор SQL в переменную, которая и повторно используется в моем скрипте

#sql-server

#sql-server

Вопрос:

Я не понимаю, почему моя переменная ColumnList2 пуста, я хочу повторно использовать эту переменную в моем скрипте.

 DECLARE @ColumnList nvarchar(max) = 
    'SELECT @ColumnListOut = STUFF(
      (SELECT
         '', ''   QUOTENAME(COLUMN_NAME)
       FROM INFORMATION_SCHEMA.COLUMNS
       WHERE TABLE_NAME = ''s_CRM_Perms''
         AND COLUMN_NAME LIKE''AC_%''
       FOR XML PATH('''') ), 1, 1, '''' )'

DECLARE @ColumnList2 nvarchar(max)  

EXECUTE sp_executeSQL @ColumnList,N'@ColumnListOut nvarchar(max) output', @ColumnListOut = @ColumnList2 OUT

DECLARE @Dynasql as varchar(max)
DECLARE @tb as varchar(512)
DECLARE @Where as varchar(max)

SET @tb = ' S_CRM_Perms'
SET @Where = ' WHERE [GroupName] = ''Guest'' '
SET @Dynasql = (' SELECT '   @ColumnList2   ' FROM'   @tb   @Where )

EXECUTE sp_executeSQL @Dynasql
  

Комментарии:

1. В вашем динамическом SQL здесь нет ничего динамического. Вы могли бы достичь этого, используя обычное присвоение переменной. Есть ли причина, по которой вы используете динамический SQL?

2. Что я пытаюсь сделать, так это получить список столбцов и вставить этот список в другой запрос. Целью этого является динамическое выполнение второго запроса, поскольку столбцы в таблице могут отличаться от таблицы к таблице.

3. Я полностью понимаю это, но генерация списка столбцов не обязательно должна быть динамическим sql, например dbfiddle.uk /…

4. Ок, понял. Но второй запрос должен быть динамическим, верно? Я обновил свой код, но все еще не работает.

5. Хорошо, это был nvarchar вместо varchar.

Ответ №1:

В вашем запросе не хватает нескольких фрагментов. Попробуйте это:

 DECLARE @ColumnList nvarchar(max) =  ' SELECT @ColumnListOut = STUFF(
(select
'', ''   QUOTENAME(COLUMN_NAME)
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = ''s_CRM_Perms''
and COLUMN_NAME like ''AC_%''
  FOR XML PATH('''') ), 1, 1, '''' )'

DECLARE @ColumnList2 nvarchar(max)  

EXECUTE sp_executeSQL @ColumnList,N'@ColumnListOut nvarchar(max) output', @ColumnListOut = @ColumnList2 OUT

select @ColumnList2