2014-12-03 47 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

您正在創建一個**動態查詢裏面**臨時表** * *只能在**動態查詢**會話中訪問**您無法在動態查詢外訪問它 – 2014-12-03 10:41:56

+0

可能的重複[使用動態sql創建臨時表時出錯](http://stackoverflow.com/questions/9338963 /錯誤合使用創建-A-TEMP-表動態-SQL ) – AHiggins 2014-12-03 19:11:22

+0

如果你想撤回你的問題,然後刪除它,但不要編輯文本,以便現有的答案與你的問題沒有關係。 – 2014-12-04 15:29:40

回答

0

正如我在評論中提到的,你不能訪問一個臨時表動態查詢這是創建動態查詢裏面的範圍之外。

另一種方法是通過創建一個Global TempTablePhysical 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

嗨,這將工作,但如果我們要使用全局臨時表,那麼該表將被其他用戶訪問,我將避免使用它。有沒有其他方式或不同的邏輯? – 2014-12-03 10:52:40

+0

@Thomas_ITsavvy在這種情況下,它會失敗。爲什麼你想動態創建一個表?嘗試改變這種方法 – 2014-12-03 10:58:30

+0

@NoDisplayName。根據要求,沒有。我收到的城市中,我需要創建這些許多表和存儲信息,然後鏈接到其他表,它是一個很大的sp。如果我採用你的方法,請建議,如果我放棄SP的全局臨時表結束,會影響其他用戶? – 2014-12-03 11:47:39

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

當它被另一個用戶在另一個會話中使用時,它將刪除臨時表,這不應該發生 – 2014-12-03 11:03:56

+0

@NoDisplayName是的,我同意你的看法,因爲它全局臨時,但是我在閱讀代碼和下面的註釋之前編寫了這段代碼,我認爲這個問題只是在程序中使用臨時表 – Vasily 2014-12-03 11:37:14