Мне нужно получить имена столбцов таблицы, расположенной в другой базе данных. Следующий скрипт работает для активной базы данных, но мне нужно, чтобы запустить его на другую базу данных на тот же экземпляр сервера:Выполнение хранимой процедуры в другой базе данных с параметрами
SELECT @ColumnList =
CASE
WHEN @ColumnList IS NULL THEN name
WHEN @ColumnList IS NOT NULL THEN @ColumnList + ',' + name
END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);
Вот вопрос ... база данных не известна во время компиляции. Его передают в хранимую процедуру во время выполнения. Поэтому я не вижу альтернативы, кроме как использовать динамический sql. В прошлом я пытался использовать Use [DBName]
в динамическом сценарии SQL, но всегда столкнулся с проблемами, пока я не понял, что я мог бы сделать это:
SET @SQL = 'SELECT Foo FROM Bar'
SET @sp_executesql = quotename(@DatabaseName) + '..sp_executesql'
EXECUTE @sp_executesql @SQL
Но я с трудом выяснить, как сделать это с помощью сценария I упомянутое выше. Моя первая попытка выглядела как:
-- @DatabaseName and @TableName are parameters of the
-- stored procedure containing this script
DECLARE @ColumnList nvarchar(max),
@SQL nvarchar(max),
@sp_executesql nvarchar(max) = quotename(@DatabaseName) + '..sp_executesql';
SET @SQL =
'SELECT @ColumnList =
CASE
WHEN @ColumnList IS NULL THEN name
WHEN @ColumnList IS NOT NULL THEN @ColumnList + '','' + name
END
FROM sys.columns
WHERE object_id = Object_Id(@TableName);'
EXECUTE @sp_executesql @SQL,
N'@ColumnList = nvarchar(max) OUT, @TableName = sysname',
@ColumnList, @TableName
Но когда он работает не интерпретируют @ColumnList
в качестве действительного переменного. Что мне не хватает?
Какой синтаксис вы имеете в виду? –
'EXEC @sp_executesql @ sql' - Я предполагаю, что вы хотели каким-то образом вызывать' EXEC sp_executesql @ sql'. –
'EXEC @sp_executesql @ sql' использует вложенный динамический sql для вызова' sp_executesql' против '@ DatabaseName'. Выбрали его из [здесь] (http://www.sommarskog.se/dynamic_sql.html#Common_cases) –