2017-02-24 4 views
0

eine Zeichenfolge verwenden, dieMit einer Zeichenfolge, die in einer Abfrage von Werten umfassen

von Werten in einer Abfrage umfasst

dieses So klingt wahrscheinlich likea dumme Frage, aber ich habe noch nie etwas liek dies getan ....

auch eine Frage haben, die ...

ich habe eine Zeichenfolge, die wie folgt aussieht ....

ValueID = 123, 234, 345, 466, 456 

ich so geht

Select * from Tbl1 where SomeValue In (123,234,345, 466, 456) 

Also, was ich versuche jetzt zu tun ist, diese ...

Select * from Tbl1 where someValue in (ValueID) 

Ist etwas wie das machbar?

+0

Nicht die Art, wie Sie implizieren - Sie müssten die Abfrage über dynamische SQL erstellen. – Siyual

+4

[parameterize sql in Klausel] (http://stackoverflow.com/questions/337704/parameterize-an-sql-in-clause?page=1&tab=oldest#tab-top) – SqlZim

+0

@SqlZim - ich versuche nicht Verwenden Sie Parameter.Ich versuche es so, ist es möglich? – BobSki

Antwort

3

Ich glaube, Sie wollen verwenden dynamische Abfrage: -

der nächste Code-Hilfe ist?

declare @ValueID varchar(200) 
set @ValueID = '123, 234, 345, 466, 456' 
exec ('Select * from Tbl1 where someValue in ('+ @ValueID +')') 
+0

ja in vb.net ich tat ("& ValueID &") und es macht den Job! – BobSki

+0

@BobSki Das ist .. sql injection .. http://bobby-tables.com/ – SqlZim

+0

@sqlzim - intern. Ich mache mir keine Sorgen – BobSki

1

Ihre ValueID var sollte eine Zeichenfolge sein.

ValueID = '123, 234, 345, 466, 456'; 

Nun hängt es von der Sprache, die Sie verwenden, aber sie bräuchten diese Variable mit dem Query-String, gegeben verketten, dass SQL-Abfragen in String sein sollten. Um dies dynamisch zu tun, möchten Sie vielleicht versuchen und verketten als @ahmed Abdelqader sagte in der Antwort unten.

declare @ValueID varchar(200) 
set @ValueID = '123, 234, 345, 466, 456' 
exec ('Select * from Tbl1 where someValue in ('+ @ValueID +')') 
0

eine CSV-Splitter Funktion von Jeff Moden verwenden:

create table v (ValueId varchar(8000)) 
insert into v values ('123, 234, 345, 466, 456'); 

create table t (someValue int); 
insert into t values (345),(346) 

select * 
from t 
where someValue in (
    select x.Item 
    from v 
    cross apply (
     select Item 
     from [dbo].[delimitedsplit8K](v.ValueId,',') 
     ) as x 
    where x.Item <>'' 
    ) 

Testaufbau: http://rextester.com/GRNWY13179

kehrt:

+-----------+ 
| someValue | 
+-----------+ 
|  345 | 
+-----------+ 

Splitting Saiten Referenz:

1

Es ist machbar.

Folgen Sie dem hier angegebenen Ansatz.

DECLARE @MyList TABLE (Value VARCHAR(10)) 
INSERT INTO @MyList VALUES ('123') 
INSERT INTO @MyList VALUES ('234') 
[...] 

SELECT * 
FROM MyTable 
WHERE MyColumn IN (SELECT Value FROM @MyList) 

, die von Define variable to use with IN operator (T-SQL) meine bevorzugte Antwort. Dies erfüllt die Ziele der ursprünglichen Frage, denke ich. Durch das Erstellen einer Liste von Werten, in diesem Fall String-Werten, arbeitet der IN-Operator wie erwartet. Wenn Sie INT-Werte haben möchten, ändern Sie einfach VARCHAR zu INT und entfernen Sie die Anführungszeichen.

Verwandte Themen