Kom ihåg mig?
Home Menu

Menu


SQL-problem (T-SQL, SP, variabel)

Ämnesverktyg Visningsalternativ
Oläst 2011-01-04, 10:51 #1
digis avatar
digi digi är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2004
Inlägg: 1 335
digi digi är inte uppkopplad
Har WN som tidsfördriv
digis avatar
 
Reg.datum: Jul 2004
Inlägg: 1 335
Standard SQL-problem (T-SQL, SP, variabel)

Tjo!

Vi stötte på ett litet problem på jobbet när vi skulle skapa en ny SP i MSSQL 2008.

Saken är att vi har en query i stil med:

Kod:
SELECT stuff FROM table
WHERE thing IN ('1','2','3')
Är det möjligt att göra något i stil med:

Kod:
CREATE PROCEDURE test
@things VARCHAR(400)
AS
BEGIN
SELECT stuff FROM table
WHERE thing IN @things
END
Kort och gott: går det att skicka in en sträng i stil med '1','2','3' och använda denna i en IN?
Om det går; måste jag då skicka med ( och ) också?

Tack på förhand
Pelle
digi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-04, 16:53 #2
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
Nja, det går nog inte, men kör dynamisk sql annars..

CREATE PROC Foo
@stringpassed
AS
BEGIN
DECLARE @SQL varchar(100)
SET @SQL = 'SELECT * FROM table WHERE idno IN ' + @stringpassed

EXEC(@SQL)
END
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-05, 01:01 #3
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
ändra till

WHERE thing = ANY(@things)

och gör om @things till en array-variabel.
Bjorne är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-05, 23:05 #4
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Har du möjlighet att lägga upp innehållet i @Things till en tabell i SQL så får du ett smidigt sätt att hantera det internt i SPn:



Kod:
CREATE PROCEDURE test
AS
BEGIN
    SELECT stuff FROM table
    WHERE thing IN (SELECT Thing FROM Things)
END
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-06, 09:38 #5
digis avatar
digi digi är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2004
Inlägg: 1 335
digi digi är inte uppkopplad
Har WN som tidsfördriv
digis avatar
 
Reg.datum: Jul 2004
Inlägg: 1 335
danjel: Funderade på det, men det är en rätt stor SP och kommer se grötigt ut

Bjorne: Fränt! Hur konverterar man en sträng till en array i t-sql?

Conny: Som det ser ut nu kommer det bli nått i stil med det du föreslog. Kommer dock skapa en virtuell tabell isf
digi är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-07, 10:33 #6
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
danjel danjel är inte uppkopplad
Medlem
 
Reg.datum: Nov 2003
Inlägg: 214
kolla även denna, intressant..
http://www.4guysfromrolla.com/webtech/031004-1.shtml
danjel är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-07, 12:22 #7
dAEks avatar
dAEk dAEk är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2006
Inlägg: 678
dAEk dAEk är inte uppkopplad
Mycket flitig postare
dAEks avatar
 
Reg.datum: Dec 2006
Inlägg: 678
Följande sida listar ett par do's and don'ts. Den är absolut värd en plats bland ens bokmärken.

http://www.sommarskog.se/arrays-in-sql-2008.html
dAEk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2011-01-08, 23:00 #8
robbanps avatar
robbanp robbanp är inte uppkopplad
Medlem
 
Reg.datum: Apr 2010
Inlägg: 76
robbanp robbanp är inte uppkopplad
Medlem
robbanps avatar
 
Reg.datum: Apr 2010
Inlägg: 76
Standard Behändig funktion för listor

Denna funktion använder jag mig av ofta för att konvertera en kommaseparerad sträng till en table för att göra en insert med.

Kod:
create FUNCTION [dbo].[StringList_To_Table] (@list nvarchar(MAX))
   RETURNS @tbl TABLE (String nvarchar(max) NOT NULL, [Id] [int] IDENTITY(1,1) NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (String)
         VALUES (convert(nvarchar, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
  RETURN
END
Sen kan du använda dig av den så här:

Kod:
insert into table MyTable select String,Id from  StringList_To_Table('hej,hopp,test')
robbanp är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 20:40.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017