#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