2014-12-03 3 views
0

여러 테이블을 생성하는 동적 스크립트를 만들려고합니다. 다음은 샘플입니다.동적 테이블을 생성하는 스크립트

--exec USP_Dynamic_tablescript 
Create procedure USP_Dynamic_tablescript 
as 
    DECLARE @SQLStmt nvarchar(3000) 
    DECLARE @table_name nvarchar(3000) 
    DECLARE @i int 

    set @i=1 

    while(@i<=3) 
    begin 
     set @table_name = '#tblSales' + convert(varchar(10),@i) 

     SET @SQLStmt = 'create TABLE ' + @table_name + '(' + ' CityId int , ' + 
         ' SalesPersonId int , ' + ' SalesAmount numeric(10,2), ' + 
         ' MetTarget nvarchar(2) ' + ') '+ 
         ' ON [PRIMARY] WITH (DATA_COMPRESSION = NONE)' 

     print @table_name 

     EXEC sp_executesql @SQLStmt 

     set @i = @i + 1 
    end 

    SELECT * from #tblSales1 

    INSERT INTO #tblSales1(CityId, SalesPersonId, SalesAmount, MetTarget) 
    VALUES (1, 101, 1650.00, 'Y') 

이러한 임시 테이블에서 DML 문을 실행해야합니다.

내가 시도하면 오류가 발생합니다. 범위를 이해하는 데 도움이, 테이블이 성공적으로 만들어 지지만 어떻게 DML 작업을 실행할 수 있습니까?

메시지 208, 수준 16, 상태 0, 절차 USP_Dynamic_tablescript, 선 (31)
잘못된 개체 이름 '#의 tblSales1'. 내가 코멘트에서 언급 한 바와 같이

+1

당신은 ** 동적 쿼리 안에 ** 임시 테이블 **를 만드는 * * 동적 쿼리 ** 세션 내에서만 액세스 할 수 있습니다. ** 동적 쿼리 외부에서 액세스 할 수 없습니다. –

+0

[동적 SQL을 사용하여 임시 테이블을 만드는 중 오류가 있습니다.] (http://stackoverflow.com/questions/9338963)/임시 테이블을 사용하여 동적 SQL 생성 오류) – AHiggins

+0

질문을 철회하고 싶다면 질문을 삭제하고 텍스트를 편집하지 마십시오. 그러면 기존 답변이 귀하의 질문과 관련이 없습니다. –

답변

0

당신은 입니다는 동적 쿼리 내부을 만들어 동적 쿼리의 범위를 벗어나는 임시 테이블 에 액세스 할 수 없습니다.

대체 방법은 만들어하는 Global TempTable 또는 동적 쿼리의 외부에서 사용할 수 있습니다 Physical table

DECLARE @SQLStmt nvarchar(3000) 
DECLARE @table_name nvarchar(3000) 
DECLARE @i int 

set @i=1 

while(@i<=3) 
begin 
    set @table_name = '##tblSales' + convert(varchar(10),@i) 

    SET @SQLStmt = 'create TABLE ' + @table_name + '(' + ' CityId int , ' + 
        ' SalesPersonId int , ' + ' SalesAmount numeric(10,2), ' + 
        ' MetTarget nvarchar(2) ' + ') '+ 
        ' ON [PRIMARY] WITH (DATA_COMPRESSION = NONE)' 

    print @table_name 

    EXEC sp_executesql @SQLStmt 

    set @i = @i + 1 
end 

SELECT * from ##tblSales1 

+0

안녕하세요,하지만 우리가 글로벌 임시 테이블을 사용하려고한다면 테이블은 다른 사용자에게 접근 할 수 있습니다. 나는 그것을 사용하지 않을 것입니다. 다른 방법이나 다른 논리가 있습니까? –

+0

@Thomas_ITsavvy 예.이 경우 실패합니다. 왜 테이블을 동적으로 만들고 싶습니까? 이 접근 방식을 변경하려고 시도하십시오. –

+0

@NoDisplayName. 요구 사항에 따라, 아니오. 도시의 내가받은, 나는 그 많은 테이블을 만들고 정보를 저장하고 다른 테이블, 그 큰 SP에 연결해야합니다. 만약 당신의 접근 방식과 함께 간다면 제발, 내가 SP의 글로벌 임시 테이블 끝을 드롭하면, 그것은 다른 사용자에게 영향을 미칠 것인가? –

0
CREATE PROCEDURE USP_Dynamic_tablescript 
AS 
DECLARE @SQLStmt NVARCHAR(3000) 
    ,@table_name NVARCHAR(3000) 
    ,@i INT 

SET @i = 1 

WHILE (@i <= 3) 
BEGIN 
    SET @table_name = '##tblSales' + convert(VARCHAR(10), @i) 
    SET @SQLStmt = 'IF OBJECT_ID(''Tempdb..' + @table_name + ''') IS NOT NULL' + CHAR(10) + 
        'DROP TABLE ' + @table_name + CHAR(10) + 
        'CREATE TABLE ' + @table_name + CHAR(10) + 
        '(CityId int ,' + CHAR(10) + 
        ' SalesPersonId int ,' + CHAR(10) + 
        ' SalesAmount numeric(10,2),' + CHAR(10) + 
        ' MetTarget nvarchar(2))' + CHAR(10) + 
        ' ON [PRIMARY] WITH (DATA_COMPRESSION = NONE)' 

    PRINT @SQLStmt 

    EXEC sp_executesql @SQLStmt 

    SET @i = @i + 1 
END 

INSERT INTO ##tblSales1 (
    CityId 
    ,SalesPersonId 
    ,SalesAmount 
    ,MetTarget 
    ) 
VALUES (
    1 
    ,101 
    ,1650.00 
    ,'Y' 
    ) 

SELECT * 
FROM ##tblSales1 
+0

이것은 다른 사용자가 다른 세션에서 사용하는 임시 테이블을 삭제합니다. 이는 발생하지 않아야합니다. –

+0

@NoDisplayName 예를 들어, 글로벌 temp, 하지만 아래 코드와 주석을 읽기 전에이 코드를 작성 했으므로 문제는 프로 시저 내부의 임시 테이블 사용에 있다고 가정했습니다. – Vasily