2012-02-22 3 views
0
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

+0

Если вы используете MySQL, пожалуйста, добавьте тег "MySql". – Kamil

+0

nope, SQL Server 2008 – Zyku

+0

Вы ссылаетесь на вставленный код? – Zyku

ответ

3

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

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

Результат:

value 
+0

EXEC sp_executesql @b, N '@ a nvarchar (10)', @a Я не могу использовать @a, потому что я не знаю названия параметра я получаю из кода: ВЫБОР PARAMETER_NAME оТ INFORMATION_SCHEMA.PARAMETERS ГДЕ SPECIFIC_NAME = «marianTest» – Zyku

+0

вы не можете выполнить скрипт внутри отборное, так что вам нужно поставить PARAMETER_NAME внутри переменной или курсор, и если с помощью через петлю курсора. Выполняя скрипт. При этом вы можете заполнить @a параметром –

+0

, да, это идея, я попробую – Zyku

2

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

Try перед 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; 
+0

SET @b = 'PRINT @a' динамический запрос, который я получаю от другой функции (имя входного параметра процедуры), есть 100-строчная функция, и я хочу это больше процедур , так что мне нужно волшебство – Zyku

+0

Вам нужно показать нам, что вы НАСТОЯТЕЛЬНО хотите сделать, а не какое-то тривиальное представление. –

1

Если вы хотите использовать параметры/переменные в динамическом SQL вы должны использовать sp_executesql с параметрами , См. The Curse and Blessings of Dynamic SQL за отличное введение в динамический SQL.

+0

Он использует его на последней строке: 'EXEC sp_executesql @ b' – Bridge

+0

@Bridge Чертовски, ты прав. Но он использует его неправильно, поэтому ссылка по-прежнему является действительным ответом. –

+0

Ему нужно добавить параметры, хотя, следовательно, моя ссылка для примера! :-) Я определенно рекомендую страницу Эрланда, хотя я ее уже любил. – Bridge

Смежные вопросы