Динамический SQL Выберите имя переменной - PullRequest
0 голосов
/ 27 марта 2019

У меня есть следующий оператор SQL, который отлично работает:

DECLARE @TableName VARCHAR(250);
SET @TableName = 'TBL_Name'
SELECT QUOTENAME(@TableName) As TableName, HASHBYTES('SHA1', (SELECT * FROM TBL_Name FOR XML RAW)) As TableHash

Теперь я хочу иметь возможность передавать имя таблицы как переменную, чтобы я мог использовать это как функцию, поэтому я попробовал это:

DECLARE @TableName VARCHAR(250);
SET @TableName = 'TBL_Name'
EXEC('SELECT QUOTENAME(' + @TableName + ') As TableName, HASHBYTES(''SHA1'', (SELECT * FROM TBL_NameFOR XML RAW)) As TableHash');

Когда я запускаю это, я получаю следующую ошибку:

Invalid column name 'TBL_Name'.

Если я удаляю имя столбца и изменяю его на это, оно работает:

DECLARE @TableName VARCHAR(250);
SET @TableName = 'TBL_Name'
EXEC('SELECT HASHBYTES(''SHA1'', (SELECT * FROM ' + @TableName + ' FOR XML RAW)) As TableHash');

МОЙ вопрос, как мне получить запрос на вывод имени таблицы в виде столбца?

1 Ответ

1 голос
/ 27 марта 2019

QUOTENAME функция имеет второй необязательный параметр для переноса значения с другим символом, в вашем случае вам нужно использовать одинарную кавычку, чтобы использовать @TableName в качестве значения varchar при первом использовании и в качестве имени таблицы во втором

DECLARE @TableName NVARCHAR(250);
SET @TableName = N'TBL_Name'
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ' + QUOTENAME(@TableName,'''') + N' as TableName, HASHBYTES(''SHA1'', (SELECT * FROM ' + QUOTENAME(@TableName) + N' FOR XML RAW)) As TableHash'
EXEC(@SQL);

Будет создан следующий код

SELECT 'TBL_Name' as TableName, HASHBYTES('SHA1', (SELECT * FROM [TBL_Name] FOR XML RAW)) As TableHash
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...