2016-08-20 5 views
1

My-Code GetrenntKönnen wir passieren Comma Liste in SQL als Parameter

declare @text as nvarchar(max) 
set @text=N'''ABC'',''XYZ'',''MNO'',''PQR''' 
print @text 
select * from table where column in(@text) --Line1 
select * from table where column in('ABC','XYZ','MNO','PQR') --Line2 

Ausführen Line1 und Netz2 unterschiedliche Ergebnisse. Line2 funktioniert gut, kann aber Line1 nicht ausführen. Kann mir jemand dabei helfen. Ich möchte Line1 ausführen, da die Liste mein Parameter in Stored Procdure sein wird.

+0

können Sie es mit dynamischem SQL machen. Verwenden Sie 'exec ('Ihre Abfragezeichenfolge')' –

+0

Betrachten Sie einen Tabellenwertparameter anstelle einer Zeichenfolge mit Trennzeichen: https://msdn.microsoft.com/en-us/library/bb510489.aspx. –

+0

Mögliches Duplikat von [Übergabe eines varchar voll von durch Kommas getrennte Werte an eine SQL Server IN-Funktion] (http://stackoverflow.com/questions/878833/passing-a-varchar-full-of-comma-de-limited-values-to -a-SQL-Server in Funktion –

Antwort

1

Sie können. Aber Sie können IN nicht für das von Ihnen beabsichtigte Verhalten verwenden. So ein Verfahren ist:

select t.* 
from table 
where ',' + @text + ',' like '%,' + column + ',%' ; 

Eine andere Methode ist dynamisches SQL verwenden zusammen mit exec.

Ein weiterer Grund ist eine split() funciton zu verwenden:

with vals(val) as (
     select * 
     from dbo.split(@text, ',') 
    ) 
select t.* 
from table t 
where t.column in (select v.val from vals v); 

Sie können Google "SQL Server split" für eine split() Funktion den Code zu finden.

Es gibt andere Möglichkeiten vals als Tabelle zu berechnen, einschließlich rekursiven CTEs und XML-Verarbeitung.

0

ich diese verwenden, wenn sie mit SSRS Umgang berichtet. Übergeben Sie die Zeichenfolge mit Trennzeichen und teilen Sie sie in eine temporäre Tabelle auf, der Sie dann beitreten oder in einer IN-Klausel verwenden können.

DECLARE @text NVARCHAR(20) = 'test;parameter;here' 

SELECT Col INTO #text FROM dbo.GetTableFromDelimitedString(@text, ';') 

SELECT * FROM table WHERE col IN (SELECT Col FROM #text) 

-Code für diese Funktion:

CREATE FUNCTION dbo.GetTableFromDelimitedString 
    (
    @str VARCHAR(8000), 
    @delimiter CHAR(1) 
    ) 
RETURNS @t TABLE (Col VARCHAR(50)) 
AS 
    BEGIN 
     DECLARE @s VARCHAR(100), 
      @l INT, 
      @cnt INT; 
     SET @l = LEN(@str); 
     SET @s = ''; 
     SET @cnt = 1; 
     WHILE @cnt <= @l 
      BEGIN 
       IF SUBSTRING(@str, @cnt, 1) = @delimiter 
        BEGIN 
         INSERT INTO @t 
           (Col) 
         VALUES (@s); 
         SET @s = ''; 
        END; 
       ELSE 
        BEGIN 
         SET @s = @s + SUBSTRING(@str, @cnt, 1); 
        END; 
       SET @cnt = @cnt + 1; 
      END; 

---insert last one 
     INSERT INTO @t 
       (Col) 
     VALUES (@s); 
     RETURN; 
    END; 
0

Eine andere mögliche Lösung ohne die Verwendung eines Split-Funktion und eine sargable Lösung wäre wie etwas sein .....

Declare @text nvarchar(max), @xml xml; 

SET @text= N'ABC,XYZ,MNO,PQR'; 

SET @xml = N'<root><r>' + replace(@text, ',','</r><r>') + '</r></root>'; 

select * 
from table 
where column in(
       select r.value('.','varchar(max)') 
       from @xml.nodes('//root/r') as records(r) 
       ); 
0
CREATE TABLE t 
    ( 
    id INT, 
    col1 VARCHAR(50) 
) 

INSERT INTO t 
VALUES  (1, 
      'param1') 

INSERT INTO t 
VALUES  (2, 
      'param2') 

INSERT INTO t 
VALUES  (3, 
      'param3') 

INSERT INTO t 
VALUES  (4, 
      'param4') 

INSERT INTO t 
VALUES  (5, 
      'param5') 

DECLARE @params VARCHAR(100) 

SET @params = ',param1,param2,param3,' 

SELECT * 
FROM t 
WHERE Charindex(',' + Cast(col1 AS VARCHAR(8000)) + ',', @params) > 0 

finden die Arbeits Fiddle http://sqlfiddle.com/#!3/71c5d/1

Verwandte Themen