2009-04-29 7 views

답변

200

당신은

DECLARE @retval int 
DECLARE @sSQL nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 

DECLARE @tablename nvarchar(50) 
SELECT @tablename = N'products' 

SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename; 
SET @ParmDefinition = N'@retvalOUT int OUTPUT'; 

EXEC sp_executesql @sSQL, @ParmDefinition, @[email protected] OUTPUT; 

SELECT @retval; 

을 할 수 있지만 그렇지, 그리고 SP 변경할 수없는 경우 :

-- Assuming that your SP return 1 value 
create table #temptable (ID int null) 
insert into #temptable exec mysp 'Value1', 'Value2' 
select * from #temptable 

꽤 있지만, 작품 없음.

+0

sp는 sp_executesql @myQuery입니다. – JohnIdol

+0

'@ retvalOUT = @ retval OUTPUT'? 'sp_executesql'의 세 번째 매개 변수는'@retval OUTPUT'일까요? –

+0

나는 그것을 얻었다! 선택적으로 매개 변수의 이름을 허용합니다. –

25
DECLARE @vi INT 
DECLARE @vQuery VARCHAR(1000) 

SET @vQuery = 'SELECT @vi= COUNT(*) FROM <TableName>' 

EXEC SP_EXECUTESQL 
     @Query = @vQuery 
     , @Params = N'@vi INT OUTPUT' 
     , @vi = @vi OUTPUT 

SELECT @vi 
+7

viOUTPUT 및 viINT 변수의 선언은 어디에 있습니까? –

+0

이것은 나를 위해 일했다.더 많은 투표가있는 대답이 작동하지 않았습니다. –

+2

매개 변수 @vQuery **는 반드시 VARCHAR가 아닌 NVARCHAR로 선언되어야합니다. – eFarzad

33
DECLARE @tab AS TABLE (col VARCHAR(10), colu2 varchar(10)) 
    INSERT into @tab EXECUTE sp_executesql N'SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2' 

    SELECT * FROM @tab 
+0

전에이 방법을 사용했습니다. 첫 번째'insert into @ tab'에서만 작동하는 것 같습니다. 'insert into @ tab'을 실행하고 여러개의'execute sp_executesql'을 실행 시키면 다른 sql로'select * from @ tab' 만 첫 번째 결과를 보여줍니다 –

+0

죄송합니다. 제 2 선택에서 오류가 발생하여 제로 행을 반환했습니다. 이 방법은 훌륭하게 작동하며 임시 테이블을 필요로하지 않습니다! –

+1

이 작업을 수행하려면 SQL Server 2008이 필요합니다. –

3

선언 @variable INT

Exec을 @variable = PROC_NAME

0

리턴 값은 대체로 "리턴"성공을 반환하지만, 그 결과를하는 데 사용되지 않는 (0) 또는 오류 번호 (1-65K). 위의 결과는 sp_executesql이 값을 반환하지 않는다는 것을 나타냅니다.이 값은 올바르지 않습니다. sp_executesql은 성공하면 0을 반환하고 실패하면 다른 숫자를 반환합니다. 아래에서

, @i 인덱스 'NonExistantStaticsName'를 찾을 수 없습니다이 메시지 2727, 수준 11, 상태 1, 줄 1 을 보여줍니다 2727

DECLARE @s NVARCHAR(500) 
DECLARE @i INT; 
SET @s = 'USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];'; 
EXEC @i = sys.sp_executesql @s 
SELECT @i AS 'Blah' 

SSMS를 반환합니다.

0

이것은 오래전부터 필요했는지 확신 할 수 없지만 @@ ROWCOUNT 변수를 사용하여 이전 SQL 문과 관련된 행 수를 확인할 수 있습니다.

예를 들어 동적 Update 문을 구성하고 exec로 실행할 때 유용합니다. @@ ROWCOUNT는 갱신 된 행 수를 표시합니다.

Here is the definition

1

DECLARE @ValueTable 표 ( 값 VARCHAR (100) )

    SELECT @sql = N'SELECT SRS_SizeSetDetails.'[email protected]_NAME+' FROM SRS_SizeSetDetails WHERE FSizeID = '''[email protected]+''' AND SRS_SizeSetID = '''[email protected]_SizeSetID+''''; 

        INSERT INTO @ValueTable 
        EXEC sp_executesql @sql; 

        SET @Value=''; 

        SET @Value = (SELECT TOP 1 Value FROM @ValueTable) 

        DELETE FROM @ValueTable 
1

당신이 1 개 이상의 값이이를 사용하여 반환 할 경우

DECLARE @sqlstatement2  NVARCHAR(MAX); 
DECLARE @retText   NVARCHAR(MAX); 
DECLARE @ParmDefinition  NVARCHAR(MAX); 
DECLARE @retIndex   INT = 0; 

SELECT @sqlstatement = 'SELECT @retIndexOUT=column1 @retTextOUT=column2 FROM XXX WHERE bla bla'; 

SET @ParmDefinition = N'@retIndexOUT INT OUTPUT, @retTextOUT NVARCHAR(MAX) OUTPUT'; 

exec sp_executesql @sqlstatement, @ParmDefinition, @[email protected] OUTPUT, @[email protected] OUTPUT; 

반환 값은 @retIndex 및 @retText입니다.

관련 문제