2017-10-17 34 views
0

je la requête T-SQL suivante (qui sera à l'intérieur d'une procédure stockée):virgule de sortie SQL Server 2016 seperated liste des noms de table

DECLARE @columnNames nvarchar(MAX); 

SELECT 
    @columnNames = COALESCE(@columnNames + ',','') + sC.name 
FROM 
    sys.columns sC 
JOIN 
    sys.tables AS sT ON sT.object_id = sC.object_id 
WHERE 
    sC.name NOT IN (SELECT name 
        FROM sys.identity_columns 
        WHERE is_identity = 1) 
    AND sT.name = 'Audit' 
ORDER BY 
    sC.column_id 

INSERT INTO [B2017].[dbo].[Audit] (@columnNames) 
VALUES ('') 

Si je lance ceci:

DECLARE @columnNames nvarchar(MAX); 

SELECT 
    @columnNames = COALESCE(@columnNames + ',','') + sC.name 
FROM 
    sys.columns sC 
JOIN 
    sys.tables AS sT 
ON 
    sT.object_id = sC.object_id 
WHERE 
    sC.name NOT IN (SELECT name FROM sys.identity_columns WHERE is_identity = 1) 
AND 
    sT.name = 'Audit' 
ORDER BY 
    sC.column_id 

il affiche comme il se doit:

columnName1,columnName2,columnName3,etc... 

Cependant, ce que je veux faire est de sortie qui (@columnNames) dans une INSERT INTO si e Je peux changer dynamiquement les noms des colonnes de la table Audit à tout moment sans avoir besoin de modifier la procédure stockée.

Donc, en prenant les noms de colonnes d'exemple ci-dessus, ce que je suis en train de faire:

INSERT INTO [B2017].[dbo].[Audit] (columnName1, columnName2, columnName3,etc...) 
VALUES ('somevalue1,somevalue2,somevalue3,...') 

Lorsque vous essayez le code complet ci-dessus (c'est notamment l'instruction INSERT INTO) Je reçois cette erreur:

Msg 207, Level 16, State 1, Line 51
Invalid column name '@columnNames'

Répondre

0

Vous devez utiliser SQL dynamique:

declare @sql nvarchar(max); 

set @sql = ' 
INSERT INTO [B2017].[dbo].[Audit] ([columnNames]) 
    VALUES ('''') 
'; 

set @sql = replace(@sql, '[columnNames]', '@columnNames') 

exec sp_executesql @sql; 

cela dit, ce code ne fonctionne toujours pas. Vous passez une valeur dans values, mais avez plusieurs colonnes. Vous devez ajuster les valeurs pour être correct.

+0

Vous devez également supprimer la virgule supplémentaire des noms de colonne. –

0

Vous devez mettre en œuvre requête dynamique comme ci-dessous:

execute('INSERT INTO [B2017].[dbo].[Audit] (' + @columnNames + ') VALUES('''')') 
0

J'ai aussi trouvé une méthode de travail:

INSERT INTO 
    [B2017].[dbo].[Audit] OUTPUT (@columnNames) 
VALUES 
    ('somevalue1,somevalue2,somevalue3,...') 

qui fonctionne comme j'ai besoin pour.