Использование параметров OUTPUT в динамическом SQL в хранимых процедурах - возможно? - PullRequest
1 голос
/ 27 октября 2010

У меня есть SP, который я создал для проверки на валидацию и возврата параметра OUTPUT 0 (нет ошибок) или 1 (ошибка). Однако мне нужно запустить этот SP в Dynamic SQL, так как он будет проходить через цикл различных данных.

Могу ли я извлечь выход из SP через EXEC sp_executesql @SQL?

Не могу опубликовать фактический код, но могу привести пример ..

DECLARE
@SQL nVARCHAR(4000),
@SPName VARCHAR(200),
@Parm1 VARCHAR(100),
@Parm2 VARCHAR(100),
@Parm3 VARCHAR(100),
@ParmDefinition nVARCHAR(400),
@Error nVARCHAR(1)

SELECT
    @SPName = 'spExample1',
    @Parm1  = '000000',
    @Parm2  = '111111',
    @Parm3  = '@Err=@Error OUTPUT',

SET @SQL = 'EXEC ' + @SPName + ' ' + @Parm1 + ',' + @Parm2 + ',' + @Parm3 + '

SET @ParmDefinition = N'@Err2 nVARCHAR(1) OUTPUT'
EXEC sp_executesql @SQL, @ParmDefinition, @Err2=@Error OUTPUT

Переменная @SQL в конечном итоге будет:

EXEC spExample1 000000, 111111, @Err=@Error OUTPUT

^^, который прекрасно работает сам по себе.

В основном я пытаюсь получить выход через вышеуказанный код, но когда он проходит через динамически.

Возможно ли это или есть другой способ сделать это?

То, как в итоге разыгрываются вещи:

EXEC sp_executesql EXEC spExample1 000000, 111111, @Err=@Error OUTPUT, @Err2 nVARCHAR(1) OUTPUT, @Err2=@Error OUTPUT

Посмотрев на это, выглядишь смешно, но любая помощь определенно будет оценена.

Ответы [ 2 ]

3 голосов
/ 30 мая 2013

Извините за задержку: D, следующий код работает отлично (для N .. выходных и входных параметров), пожалуйста, попробуйте это ( source ):

CREATE PROCEDURE Myproc
@parm varchar(10),

@parm1OUT varchar(30) OUTPUT,
@parm2OUT varchar(30) OUTPUT
AS
SELECT @parm1OUT='parm 1' + @parm
SELECT @parm2OUT='parm 2' + @parm
GO
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @parmIN VARCHAR(10)
DECLARE @parmRET1 VARCHAR(30)
DECLARE @parmRET2 VARCHAR(30)
SET @parmIN=' returned'
SET @SQLString=N'EXEC Myproc @parm,
@parm1OUT OUTPUT, @parm2OUT OUTPUT'
SET @ParmDefinition=N'@parm varchar(10),
@parm1OUT varchar(30) OUTPUT,
@parm2OUT varchar(30) OUTPUT'

EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@parm=@parmIN,
@parm1OUT=@parmRET1 OUTPUT,@parm2OUT=@parmRET2 OUTPUT

SELECT @parmRET1 AS "parameter 1", @parmRET2 AS "parameter 2"
go
drop procedure Myproc
0 голосов
/ 28 октября 2010

Я не проверял это подробно, но я заметил следующее:

При вызове хранимых процедур нельзя смешивать и сопоставлять именованные и неименованные параметры.Таким образом, вместо

EXEC sp_executesql @SQL, @ParmDefinition, @Err2=@Error OUTPUT 

используйте

EXEC sp_executesql @SQL, @ParmDefinition, @Error OUTPUT 

, но поскольку выходной параметр, определенный для sp_executesql, равен @ Err2, он должен быть

EXEC sp_executesql @SQL, @ParmDefinition, @Err2 OUTPUT 

Это должноработа.

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