Используйте переменные из процедуры в динамическом запросе - PullRequest
0 голосов
/ 22 февраля 2012
DECLARE @a NVARCHAR(10) ,
    @b NVARCHAR(100)

SET @a = 'value'
SET @b = ' PRINT @a '

EXEC sp_executesql @b

Я хотел бы в результате: 'значение'
но я получаю ошибку Должен объявить скалярную переменную "@a"

мне нужно войти из SQL параметры, которые назывались SP

мне это нужно, потому что внутри SP я создаю динамический запрос из INFORMATION_SCHEMA.PARAMETERS

моя процедура:

ALTER PROCEDURE marianTest
@a INT,
@b NVARCHAR(121)
AS
BEGIN
DECLARE @query NVARCHAR(max)
SET @query = dbo.ufn_admin_Ex(cast(OBJECT_NAME(@@PROCID) AS nvarchar(100)))
EXECUTE sp_executesql  @query

где @query выглядит так:

declare @callSP nvarchar(max) = 
'DECLARE @a int = ' + CASE  WHEN @a IS NULL THEN 'NULL' ELSE    convert(nvarchar(15),@a)     END + CHAR(13)
+', @b nvarchar(121) = ' + CASE  WHEN @b IS NULL THEN 'NULL' ELSE + '''' + @b+   ''''     END + CHAR(13)

EXECUTE [dbo].[usp_admin_traceError] @callSp

спасибо
Marian

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Я считаю, что это то, что вы ищете:

DECLARE @a NVARCHAR(10) , @b NVARCHAR(100)  
SET @a = 'value' 
SET @b = ' PRINT @a '  
EXEC sp_executesql @b, N'@a nvarchar(10)', @a

Результат:

value
2 голосов
/ 22 февраля 2012

Вы не указываете параметры на

exec sp_executesql

См. http://msdn.microsoft.com/en-us/library/ms188001.aspx.

2 голосов
/ 22 февраля 2012

@b не может волшебным образом видеть @a, если вы не представите их каким-либо образом.

Попробуйте до выполнения exec:

SET @b = 'PRINT ''' + @a + ''';

Или вместо этого вы можете использовать sp_executesql таким образом:

DECLARE @b NVARCHAR(100);

SET @b = N'PRINT @a';

EXEC sp_executesql @b, N'@a NVARCHAR(10)', @a;
1 голос
/ 22 февраля 2012

Если вы хотите использовать параметры / переменные в вашем динамическом SQL, вы должны использовать sp_executesql с параметрами.См. Проклятие и благословения динамического SQL для превосходного введения в динамический SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...