Написать табличный запрос с динамически объявленным именем таблицы?

#sql-server #temp-tables #global-temp-tables #table-driven

#sql-сервер #временные таблицы #global-temp-tables #управляемый таблицей

Вопрос:

Я постоянно запускаю отчет и создаю таблицы для этого отчета. Теперь другие пользователи также запускают этот отчет. Поэтому мне нужно, чтобы пользователи могли запускать хранимые процедуры одновременно, не беспокоясь о перезаписи таблиц. Я пытался использовать простую временную таблицу, но мне нужна временная таблица для выполнения двух «функций». Один динамический оператор sql, который создает таблицу, и один динамический sql statment, управляемый таблицей.

Моя основная проблема в том, что я хочу, чтобы фрагмент кода, управляемый таблицей, мог видеть глобальную временную табличную переменную, но это не так. Есть ли обходной путь для этого при использовании временных таблиц? есть ли способ выполнить оба динамических оператора sql одновременно, чтобы работал другой тип временной таблицы?

Любой совет в правильном направлении полезен. Спасибо.

 DECLARE @TmpGlobalTable varchar(255) = 'SomeText_'   convert(varchar(36),NEWID())

SELECT @SQL =   @SQL  '


SELECT IDENTITY(INT) as idcol, date, Desc As [Description]
INTO [##'   @TmpGlobalTable   '] 
FROM dbo.appendix 
WHERE RecordStatus = 1
 and casestatement from user input 
 
 
 '
print(@sql) 
exec(@sql) 



Declare @sql1 varchar(max) = ''
SELECT @SQL1 =  @SQL1  '

              insert into dbo.' @table '
              select ''1'', ''' date ''' as Sequence, Description as Description_color, buyer, seller, price, option
              from ' @ClientTable '
              where isnull(' Seq ',9999) <= cutoffvalue
              group by description , buyer, seller, price, option
     '
     from 
     [##'   @TmpGlobalTable   '] 
                
             

print(@sql1) 
exec(@sql1) 

EXEC ('DROP TABLE [##'   @TmpGlobalTable   ']')
PRINT 'Dropped Table '   @TmpGlobalTable 
  

Комментарии:

1. Что именно означает «Запуск отчета»? Обычно используется для упаковки этой логики в хранимую процедуру, которая генерирует желаемый набор результатов — постоянная таблица не требуется. Но для любого руководства потребуется знание того, как этот код взаимодействует с вашим «инструментом отчетов».

2. @SMor итак, код находится в хранимой процедуре. Отчет создается из созданной таблицы , но я понял эту логику. Как бы вы объединили сценарии sql и sql1, чтобы не использовать временные таблицы?

3. Приведенный выше SQL выглядит очень открытым для инъекционных атак с синтаксисом like '...from ' @ClientTable '...' , и '...isnull(' Seq ',9999)...' вам нужно правильно цитировать и параметризовать свои динамические операторы.

4. Чего вы на самом деле пытаетесь достичь с помощью вышеупомянутого в первую очередь? Зачем вам «нужен» динамический SQL? Кроме того, включите полную DLL для вашей процедуры. Многие переменные в приведенных выше операторах, такие как @ClientTable и @table , не объявлены в вашем операторе; откуда берутся их значения?