Как исправить проблему «Должен объявить скалярную переменную» в динамическом запросе SQL Server? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь выполнить этот оператор на сервере SQL:

EXECUTE ('SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable).

Здесь @lnRowIdMin объявлено как целочисленная переменная, а @lvcBaseTable объявлено как переменная varchar (255) в моем исходном коде.

При выполнении оригинального кода выдается ошибка для вышеприведенного оператора:

Должен объявлять скалярную переменную

Затем я изменил утверждение на:

EXECUTE ('SELECT ' + @lnRowIdMin + ' = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable).

Теперь выдает эту ошибку: "Неверный синтаксис рядом с '='"

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

В общем, @lnRowIdMin объявляется вне динамического SQL, и ему нужно присвоить значение. Поэтому вам необходимо параметризовать ваш SQL и использовать параметр OUTPUT:

--Prior stuff here, including declaration of @lnRowIdMin

DECLARE @SQL nvarchar(MAX),
        @Param nvarchar(MAX);
SET @SQL = N'SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  ' + QUOTENAME(N'#' + @lvcBaseTable) + N';';
SET @Param = N'@lnRowIdMin int OUTPUT'; --Guessed datatype

EXEC sp_executesql @SQL, @Param, @lnRowIdMin = @lnRowIdMin OUTPUT;
0 голосов
/ 19 июня 2019

При выполнении динамического SQL он выполняется в другой области действия , поэтому, если вы объявите свои переменные в той же области действия, что и varchar, допускающий оператор SQL, вы получите такую ​​ошибку.

Правильным способом было бы:

EXECUTE ('DECLARE @lnRowIdMin INT; SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable)

Но тогда вы не сможете получить доступ к этой переменной извне динамического SQL, что, я думаю, вам и нужно.

Два способа решения этой проблемы:

  1. Поместите код, который также использует переменную в динамическом SQL.
  2. Вставьте значение во некоторую временную таблицу, затем вы можете использовать его вне динамическогоSQL просто выполняет SELECT для временной таблицы.
...