2016-06-06 10 views
0

Wenn ich eine durch Kommata getrennte Liste von Werten haben:Komma getrennte Werte in der Aussage SQL

A1,B2,B3 

Wie gebe ich diese in eine Variable und dann in eine SQL-IN-Anweisung bilden.

DECLARE @DATE AS VARCHAR(50) 

SELECT @DATE = CONVERT(VARCHAR(8), Getdate(), 112) 

--PRINT @DATE 
DECLARE @TIME AS VARCHAR(50) 

--PRINT TIME 
SELECT @TIME = Replace(CONVERT(VARCHAR(5), Getdate(), 108), ':', '') 

DECLARE @ID AS VARCHAR(50) 

SELECT @ID = Replace(W0128001, 32322, 32323, 3232323, 2323232, ',', ',') 

--PRINT @ID 
DECLARE @QUERY NVARCHAR(MAX); 

SET @QUERY = 'SELECT * INTO BACKUPTABLE_' + @DATE + @TIME 
      + ' 
FROM TABLE 
WHERE ID IN (' + '''' + @ID + ''')' 

--EXEC @query 
PRINT @QUERY 

habe ich versucht, eine oben zu tun ersetzen, aber ich will es so, dass ein Endbenutzer in die Werte einfügen können und mein Skript wird von dem Komma kümmern und es richtig bilden. Es sollte auch die letzten Kommas vom Ende entfernen.

Mein Ausgang muss lauten:

SELECT * INTO BACKUPTABLE_201606061503 
FROM TABLE 
WHERE ID IN ('W0128001','32322','32323','3232323','2323232') 
+0

Sieht aus, als ob Sie die richtige Idee haben, so ziemlich. Ich denke, Sie müssen die Abfrage in Klammern einschließen, um SQL Server davon abzuhalten, zu denken, dass Sie ihm den Namen eines SP geben (Wechsel zu 'EXEC (@query)') – Conduit

+0

Ich wollte es nicht bis es ausführen Ich war glücklich mit der "PRINT" – PriceCheaperton

+0

In der Regel Menschen Fehler einen einzelnen Wert, der eine durch Kommas getrennte Zeichenfolge mit einer durch Kommas begrenzten Liste von Werten enthält. Dies scheint jedoch hier nicht der Fall zu sein. Bitte beachten Sie, dass Sql-Server 2008 Tabellenwerte unterstützt, die besser als Komma-getrennte Listen für diese Art von Dingen sind. –

Antwort

2

Für eine Sache, Sie dies nicht tun es mit einfachen Anführungszeichen umgeben:

SET @QUERY = 'SELECT * INTO BACKUPTABLE_' + @DATE + @TIME + ' 
FROM TABLE 
WHERE ID IN (' + @ID + ')'; 

Es gibt andere Wege, durch Komma getrennte Werte übergeben zu einer SQL-Anweisung, einschließlich der Verwendung einer split() Funktion oder XML.

0
CREATE PROCEDURE [dbo].[CreateBackupTable] 
    @ID varchar(100) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

DECLARE @DATE VARCHAR(50)= CONVERT(VARCHAR(8), Getdate(), 112); 
DECLARE @TIME VARCHAR(50) = Replace(CONVERT(VARCHAR(5), Getdate(), 108), ':', '') 

    declare @xml xml,@SQL NVARCHAR(MAX); 

    set @xml = N'<root><r>' + replace(@ID,',','</r><r>') + '</r></root>' 

SET @SQL = N' SELECT * INTO ' + QUOTENAME('BACKUPTABLE_' + @DATE + @TIME) 
     + N' from TableName ' 
     + N' where ID IN (
          select r.value(''.'',''varchar(max)'') as item 
          from @xml.nodes(''//root/r'') as records(r) 
          )' 

    exec sp_executesql @sql 
        , N'@ID varchar(100), @xml XML' 
        , @ID 
        , @Xml 
END 
Verwandte Themen