WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SQL-problem (T-SQL, SP, variabel) (https://www.wn.se/forum/showthread.php?t=1045680)

digi 2011-01-04 10:51

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

danjel 2011-01-04 16:53

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

Bjorne 2011-01-05 01:01

ändra till

WHERE thing = ANY(@things)

och gör om @things till en array-variabel.

Conny Westh 2011-01-05 23:05

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


digi 2011-01-06 09:38

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 :)

danjel 2011-01-07 10:33

kolla även denna, intressant..
http://www.4guysfromrolla.com/webtech/031004-1.shtml

dAEk 2011-01-07 12:22

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

robbanp 2011-01-08 23:00

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')


Alla tider är GMT +2. Klockan är nu 21:01.

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