Как использовать переменную в «Выбрать [некоторые вычисления] вставить в @NameOfTheTableInThisVariable»? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть процедура, в которой выполняются вычисления, и окончательный результат вставляется в постоянную таблицу. Я хочу удалить постоянную таблицу и не могу также использовать временную таблицу. Поэтому я хочу использовать динамическое имя таблицы, которое хранится в переменной:

Текущий сценарий:

Insert into xyz_table
    Select col1,col2,sum(col3)
    from BaseTable 

(На самом деле столбцов много и много вычислений)

Что я хочу:

Select col1,col2,sum(col3) into @DynamicTableName
from BaseTable

где имя таблицы будет динамическим по своей природе, т.е.

@DynamicTableName = 'xyz ' + cast(convert(date,getdate()) as nvarchar)+' '+convert(nvarchar(5),getdate(),108)

Оно будет содержать дату и время в своем имени при каждом запуске процедуры.

Я хочу использовать это имя в «Выбрать * в утверждение»

Как мне этого добиться?

Я попробовал это с небольшим кодом. Но поскольку в моей процедуре много вычислений и UNIONS, я не могу использовать этот код для этого. Любая помощь будет оценена.

declare @tablename nvarchar(30)= 'xyz ' + cast(convert(date,getdate()) as nvarchar)+' '+convert(nvarchar(5),getdate(),108)

declare @SQL_Statement  nvarchar(100)
declare @SQL_Statement2 nvarchar(100)
declare @dropstatement  nvarchar(100)

SET @SQL_Statement = N'SELECT * Into ' +'['+@tablename +'] '+'FROM '+ 'dimBranch'
print   @SQL_Statement
EXECUTE sp_executesql @SQL_Statement

SET     @SQL_Statement= N'select * from ' + '['+@tablename + '] '
print   @SQL_Statement
EXECUTE sp_executesql @SQL_Statement

set   @dropstatement = 'DROP TABLE' + '['+@tablename + '] '
PRINT @dropstatement
exec  sp_executesql @dropstatement

Причина, по которой я этого хочу, заключается в том, что я использую эту процедуру в задании ETL, а также в отчете SSRS. И если кто-то запускает пакет и отчет SSRS одновременно, неверные или странные данные сохраняются в таблице. Поэтому мне нужно динамическое имя таблицы с датой и временем.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Рассмотрим локальную временную таблицу, которая автоматически ограничивается сессией без необходимости динамического SQL. Например:

SELECT * 
INTO #YourTempTable
FROM dimBranch;

Локальная временная таблица будет автоматически удалена после завершения процедуры, поэтому нет необходимости в явном отбрасывании в коде процедуры.

0 голосов
/ 13 июня 2019

Нельзя параметризовать идентификатор в SQL, только значение

--yes
select * from table where column = @value

--no
select * from @tablename where @columnname = @value

Единственное, что вы можете сделать, чтобы сделать эти вещи динамичными, - это создать строку sql и выполнить ее динамически, но ваш код уже делает это с sp_executesql

В нижней части вашего вопроса более показательна ваша жалоба на то, что, если процедура вызывается одновременно, это создает проблемы. Возможно, вам следует рассмотреть возможность использования локальных переменных таблицы для временного хранения данных, которые используются в отчете, а не отправлять данные обратно в базу данных

.
    DECLARE @temp TABLE(id INT, name varchar100);
    INSERT INTO @temp SELECT personid, firstname FROM person;
    -- work with temp data
    select count(*) from @temp;

    --when @temp goes out of scope it is lost, 
    --no other procedure invoked simultaneously can access this procedure'a @temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...