Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dynamiczne parsowanie zmiennych MS SQL niepoprawnie

  1. Użyj poprawnych typów SYSNAME dla identyfikatorów, NVARCHAR(MAX) dla zapytania
  2. Użyj REPLACE zamiast konkatenacji będzie znacznie łatwiej debugować, szczególnie gdy potrzebujesz literałów łańcuchowych
  3. Rozważ użycie QUOTENAME funkcja

Kod:

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

Wyjście:

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. Jak uzyskać rekord z Max (data), a następnie porównać wartości, aby uzyskać wynik?

  2. Utwórz serwer połączony między dwoma kontenerami platformy Docker z uruchomionym programem SQL Server (przykład T-SQL)

  3. Zadanie agenta SQL Server — eksport wyników do pliku rozdzielanego tabulatorami?

  4. jak sformatować getdate na RRRRMMDDGGmmSS

  5. Jak mogę zapytać, czy istnieje schemat bazy danych?