1

Я пытаюсь вызвать хранимую процедуру (с выходной переменной) с использованием sp_executesql, но в рамках другой хранимой процедуры. Я написал следующее, но до сих пор не в состоянии получить trhough, что означает, что ошибкаВложенный sp_executesql не работает с выходной переменной

Это будет вызываться из кода WebService:

exec sp1 'obj1',@params 

Здесь obj и params имеют nvarchar(max)

Определение sp1 является :

Alter procedure [dbo].[sp1 ] 
    @procname nvarchar(max), 
    @params nvarchar(max) 
as 
    declare @temp varchar(15) 

    if @procname = 'obj1' 
    begin 
     set @params = @params + ',@Newval varchar(15) output' 
     EXEC sp_executesql @sp2,@params,@[email protected] OUTPUT 
    end 

Определение sp2:

Здесь я возвращаюсь @Newval

Ошибка я получаю:

Msg 102, Level 15, State 1, Line 1
Неправильный синтаксис около ''.

Кроме того, в 2 вместо exec заявления, я попытался следующее:

EXEC sp_executesql @sp2, @params, @temp OUTPUT; 

Результаты в одной и той же ошибки.

set @sql='sp2,' + ' @params ' + ',@params,@temp OUTPUT' 
EXEC sp_executesql (@sql) 

Также приводит к такой же ошибке.

Мне нужен этот динамический выбор хранимых процедур в sp1, а params - строка параметров и их значений, некоторые из них являются varchar и встроены в формат '' value '', но эта строка прекрасна, поскольку я могу для вызова базового sp2 с этим.

Дополнительная информация, это помогает.

EXEC sp_executesql @sp2,@params,@[email protected] OUTPUT 

в этом @params - комбинация ключей и пар vlaue для окончательного sp. что-то вроде:
«@ ключом1 =„а“, @ key2 =„б“»
и так далее, я не могу с @params предопределены, но она динамична и она работает штраф, когда я запускаю его с

exec (@sql)  

Формат в то время как все названия, PARAMS встроены в @sql

ответ

0

Если @params='' или NULL тогда ваш , перед тем @Newval не имеет значения.Я предлагаю вам проверить:

IF NULLIF(@params,'') IS NULL or @params IS NULL 
SET @params = '@Newval varchar(15) output' 
ELSE 
SET @params = @params + ',@Newval varchar(15) output' 

Вы проходите @sp2, может быть вам это нужно:

ALTER PROCEDURE [dbo].[sp1] 
    @procname nvarchar(max), 
    @params nvarchar(max) 
AS 
    DECLARE @temp varchar(15) 

    IF @procname = 'obj1' 
    BEGIN 
     SET @params = @params + ',@Newval varchar(15) output' 
     EXEC sp_executesql N'EXEC sp2 @someparam1, @someparam2, @Newval varchar(15) OUTPUT', @params, @someparam1 = 1, @someparam2 = 2, @[email protected] OUTPUT 
    END 

EDIT

Рабочий пример:

USE [AdventureWorks] 
GO 

DECLARE @procname nvarchar(max) = 'EXEC [dbo].[uspGetWhereUsedProductID] @StartProductID, @CheckDate', 
     @params nvarchar(max) = '@StartProductID int, @CheckDate date' 

EXEC sp_executesql @procname, @params, @StartProductID = 1, @CheckDate = '2015-10-17' 
GO 
+0

Спасибо, но @Params является ни null, ни '' :( – user3792812

+0

Если я удалю выходная переменная. Я все еще могу вызвать sp2 со следующим объявлением @sql nvarchar (max); set @ sql = 'sp2' + '' + @params; exec (@sql), но это просто побеждает цель получения выходной переменной, а sp_executesql в этом случае не используется. Пожалуйста, подумайте, что я использую SQL Server 2005, если это помогает – user3792812

+0

Что вы отправляете в «@params» из php? – gofr1