sql >> Databáze >  >> RDS >> Sqlserver

Nesprávná analýza dynamických proměnných MS SQL

  1. Používejte správné typy SYSNAME pro identifikátory NVARCHAR(MAX) pro dotaz
  2. Použijte REPLACE místo zřetězení bude mnohem snazší ladit, zvláště když potřebujete řetězcové literály
  3. Zvažte použití QUOTENAME funkce

Kód:

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

Výstup:

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. Komplexní příkaz IF se 3 tabulkami

  2. Chyba připojení k MySQL, kterou jsem nikdy neviděl

  3. MySQL 8 vnořený výběr s počtem

  4. 3 způsoby, jak vrátit počet řádků v každém oddílu na serveru SQL (T-SQL)