Как мне динамически запрашивать значение в T-SQL?

#sql #tsql #dynamic #sp-executesql

#sql #tsql #динамический #sp-executesql

Вопрос:

По какой-то причине я не могу динамически выводить значение из SQL.

 declare @SQL nvarchar(max)
declare @FieldName nvarchar(255)
declare @FieldValue nvarchar(max)

select @SQL = 'SELECT TOP 1 '   @fieldname 
        ' FROM MyTable WHERE CM_CASE_YEAR = '   LEFT(@ClaimNumber, 2) 
        ' AND CM_CASE_NUMBER = '   RIGHT(@ClaimNumber, 6)
exec sp_executesql @sql, @FieldValue OUTPUT
select @FieldName   ' - '   @FieldValue
  

Когда я запускаю @SQL запрос в другом окне, он отображает один столбец с одним значением.

Но, к сожалению, когда я пытаюсь это сделать, @FieldValue всегда возвращает значение NULL.

Я что-то пропустил в тот день, когда они преподавали sp_executesql? Очевидно! Но что?

Ответ №1:

Смотрите этот пример

 DECLARE @SQL NVARCHAR(MAX)
DECLARE @FieldName sysname = 'name'
DECLARE @FieldValue NVARCHAR(MAX)

SELECT @SQL = 'SELECT TOP 1 
                    @FieldValue ='   QUOTENAME(@FieldName)   ' FROM sys.objects'

EXEC sp_executesql @SQL, 
                   N'@FieldValue nvarchar(max) OUTPUT',
                   @FieldValue =@FieldValue OUTPUT

SELECT @FieldName   ' - '   @FieldValue
  

Ответ №2:

sp_executesql возвращает (генерирует) результирующий набор. @FieldValue не имеет смысла в приведенном выше коде — sp_executesql не помещает никакого значения в эту переменную.

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

1. Хорошо, не могли бы вы рассказать мне, КАК я могу ввести значение в эту переменную?

2. Я только что запустил MSSQL для этой цели, Джейсон, но Мартин ответил раньше, чем я смог!