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