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.

Msg 208, Level 16, State 0, процедура USP_Dynamic_tablescript, линия 31
Неверное имя объекта '# tblSales1'.

+1

Вы создаете ** таблицу Temp ** ** внутри динамического запроса * *, который доступен только в ** сеансе динамического запроса **, вы не можете получить к нему доступ за пределами динамического запроса –

+0

возможный дубликат [ошибка при создании таблицы temp с использованием динамического sql] (http://stackoverflow.com/questions/9338963/ошибка в создании-A-ТЕМП-таблицу с использованием-динамическим SQL) – AHiggins

+0

Если вы хотите удалить свой вопрос, то удалите его, но не редактируйте текст, чтобы существующие ответы не имели никакого отношения к вашему вопросу. –

ответ

0

Как я уже говорил в комментариях вы не можете получить доступ к таблице Темп выходит за рамки динамического запроса который созданный внутри динамического запроса.

Альтернативный способ заключается в создании Global TempTable или Physical table, которые могут быть использованы за пределами Dynamic Query

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

Привет, Это сработает, но если мы собираемся использовать глобальную таблицу temp, тогда таблица будет доступна для других пользователей, и я бы не стал ее использовать. Есть ли другой способ или другая логика? –

+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

Смежные вопросы