2011-08-29 5 views
41
DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId int 
exec ('SELECT TOP 1 @siteId = Id FROM ' + @dbName + '..myTbl') 
select @siteId 

나는 다음과 같은 오류 왜, 어떻게 그것을 해결하기 위해t-sql에서 'execute'를 사용하여 값을 변수로 설정하는 방법?

Msg 137, Level 15, State 1, Line 1 
Must declare the scalar variable "@siteId". 

(1 row(s) affected) 

을 얻을 위에 나는 스크립트를 실행하면?

답변

82

sp_executesql에서 출력 매개 변수를 사용할 수 있습니다.

DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId int 
DECLARE @SQL nvarchar(max) = N'SELECT TOP 1 @siteId = Id FROM ' + quotename(@dbName) + N'..myTbl' 
exec sp_executesql @SQL, N'@siteId int out', @siteId out 
select @siteId 
+1

+1 이것은 더 좋은 방법입니다. 나는 매개 변수화 된 데이터베이스 이름을 보았고 sp_executesql을 해제했다 ... – gbn

+1

+1 임시 테이블 생성시 +1 과열 없음 – garik

20

동적 SQL은 외부 호출 SQL에 다른 범위가 감사 : 그래서 @siteid이

을 인식하지

당신은 동적 외부의 임시 테이블/테이블 변수를 사용해야합니다 SQL :

DECLARE @dbName nvarchar(128) = 'myDb' 
DECLARE @siteId TABLE (siteid int) 

INSERT @siteId 
exec ('SELECT TOP 1 Id FROM ' + @dbName + '..myTbl') 

select * FROM @siteId 

참고 : TOP 주문 BY하지 않고는 의미입니다. 테이블에는 자연 스럽거나 묵시적이거나 본질적인 순서가 없습니다. 모든 주문은 바깥 쪽에서 만 보장됩니다. 주문

+0

"BY 순서없이 TOP은 의미가 없다"- 의미없는 어쩌면 내가 원하는 모든 일 개 기록이고 내가 오늘 밤에 먹어야 즉, 어떤 레스토랑 어떤 상관 없어, 여기 아마 조금 강하다 ? – RyanfaeScotland

+0

@RyanfaeScotland : 어쩌면, 그러나 중재 행을주는 SQL에'ANY()'함수가 없습니다. 그렇지 않으면 내 쿼리가 가정 된 순서에 의존하는 대신 매번 같은 방식으로 동작하기를 바랍니다. – gbn

+0

귀하의 메모는 단지 대부분의 실제 시나리오에서 사실이 아닙니다. *** 유지 관리 ***, 테이블에 클러스터 된 인덱스는 테이블 결과에 일관되고 예측 가능한 순서를 보장합니다. – Matt

0
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  Andrew Foster 
-- Create date: 28 Mar 2013 
-- Description: Allows the dynamic pull of any column value up to 255 chars from regUsers table 
-- ============================================= 
ALTER PROCEDURE dbo.PullTableColumn 
(
    @columnName varchar(255), 
    @id int 
) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @columnVal TABLE (columnVal nvarchar(255)); 

    DECLARE @sql nvarchar(max); 
    SET @sql = 'SELECT ' + @columnName + ' FROM regUsers WHERE id=' + CAST(@id AS varchar(10)); 
    INSERT @columnVal EXEC sp_executesql @sql; 

    SELECT * FROM @columnVal; 
END 
GO 
관련 문제