Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Неправилно анализиране на динамична MS SQL променлива

  1. Използвайте правилните типове SYSNAME за идентификатори, NVARCHAR(MAX) за заявка
  2. Използвайте REPLACE вместо конкатенация ще бъде много по-лесно да се отстраняват грешки, особено когато имате нужда от низови литерали
  3. Обмислете използването на QUOTENAME функция

Код:

DECLARE 
    @tableName  SYSNAME,
    @columnName SYSNAME,
    @prompt     VARCHAR(20),
    @dynSQL     NVARCHAR(MAX);

SET @tableName  = QUOTENAME('A1-ExciseESN');
SET @columnName = QUOTENAME('Anode Excise ESN (A1)');

SET @dynSQL = 
N'INSERT INTO  <tableName> 
 ([trav num], <columnName>)
Select [trav num], <columnName>
FROM [temprmi$] t1
PIVOT(min([Lvl1 Trace Data])
FOR [Prompt Text] IN (<columnName>)
   ) AS PVTTable
     where <columnName> is not null 
        and [trav num] not in (select [trav num] from <tableName> )'

SET @dynSQL = REPLACE(REPLACE(@dynSQL, '<tableName>', @tableName),
               '<columnName>', @columnName);

PRINT @dynSQL;

LiveDemo

Изход:

INSERT INTO  [A1-ExciseESN] 
 ([trav num], [Anode Excise ESN (A1)])
Select [trav num], [Anode Excise ESN (A1)]
FROM [temprmi$] t1
PIVOT(min([Lvl1 Trace Data])
FOR [Prompt Text] IN ([Anode Excise ESN (A1)])
   ) AS PVTTable
     where [Anode Excise ESN (A1)] is not null 
       and [trav num] not in (select [trav num] from [A1-ExciseESN] )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не използвайте sp_depends в SQL Server (оттеглен е)

  2. Тип данни за запазване на excel файл в sql сървър?

  3. База данни + удостоверяване на Windows + потребителско име/парола?

  4. Обяснено за всеки оператор на SQL Server

  5. SQL Server 2008:изтриване на дублирани редове