Avatar billede dpouls1 Nybegynder
19. november 2005 - 12:39 Der er 5 kommentarer og
1 løsning

Stored procedure med brug af 'IN' function

Jeg ønsker at udtrække alle rækker med værdierne IN (100,101,102,103) via en stored procedure.

Dog har jeg lidt problemer med at konvertere til den korrekte type når jeg kalder. Jeg har en ArrayList af Id'er som jeg laver om til en string vha. StringBuilder. Den indsætter jeg så i en variabel til stored procedure som nedenstående:

****************************************************
            StringBuilder structureIds = new StringBuilder();
            for(int i=0;i<nodesId.Count;i++)
            {
                structureIds.Append(nodesId[i].ToString());
                structureIds.Append(",");
            }
            structureIds.Append("0");
            string langCode = "DA";
            DataTable toReturn = CreateDataTable();
            SqlConnection conn = new SqlConnection(connStr);
            SqlDataAdapter adapter = new SqlDataAdapter();
            adapter.SelectCommand = new SqlCommand("LoadTreeViewNodes", conn);
            adapter.SelectCommand.Parameters.Add("@LanguageKey", SqlDbType.VarChar).Value = langCode;
            adapter.SelectCommand.Parameters.Add("@StructuresID", SqlDbType.VarChar).Value = structureIds.ToString();
            adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
******************************************************

Min SP ser ud som følger:
******************************************************
CREATE PROCEDURE LoadTreeViewNodes
@LanguageKey char(2),
@StructuresID varchar
AS
SET NOCOUNT ON
SELECT    Structure.StructureID as [Key], Structure.Parent as Parent, KeyValue.[key] as KeyValueKey, KeyValue.[Value] as [Text]
FROM        Structure INNER JOIN
                      KeyValue ON Structure.StructureID = KeyValue.StructureID OR Structure.ReferenceStructureID = KeyValue.StructureID
WHERE      (KeyValue.[Key] = 'Caption'+@LanguageKey) AND (Structure.ProductionState = 0) AND (Structure.StructureID in (@StructuresID))
ORDER BY Structure.Parent, [Key]
GO
******************************************************

SP returnerer ingenting og fejler ikke. Mit bud er at @StructuresID kommer ind som "101,102,103" men den skal komme ind som 101,102,103 - altså uden gåseøjne for at SP kan forstå den.

Hvordan skal strengen formateres for at SP forstår den korrekt?
Avatar billede arne_v Ekspert
19. november 2005 - 13:56 #1
en klassisk løsning er et konkatanere en SQL streng og så EXEC'e den
Avatar billede dpouls1 Nybegynder
19. november 2005 - 14:08 #2
Jeg forstår ikke helt hvordan jeg kan gøre det gennem en stored procedure. Kan du uddybe det i forhold til mit setup?
Avatar billede arne_v Ekspert
19. november 2005 - 14:18 #3
se dette eksempel:

1> SELECT * FROM t1
2> GO
F1          F2
----------- --------------------------------------------------
          1 A
          2 BB
          3 CCC

(3 rows affected)
1>
2> CREATE PROCEDURE dyn(@list VARCHAR(255))
3> AS
4> DECLARE @sql VARCHAR(255)
5> SET @sql = 'SELECT * FROM t1 WHERE f1 IN (' + @list + ')'
6> EXEC(@sql)
7> GO
1>
2> EXEC dyn '2'
3> GO
F1          F2
----------- --------------------------------------------------
          2 BB

(1 row affected)
1>
2> EXEC dyn '2,3'
3> GO
F1          F2
----------- --------------------------------------------------
          2 BB
          3 CCC

(2 rows affected)
1>
2> EXEC dyn '1,2,3'
3> GO
F1          F2
----------- --------------------------------------------------
          1 A
          2 BB
          3 CCC

(3 rows affected)
1>
2> DROP PROCEDURE dyn
3> GO
Avatar billede arne_v Ekspert
19. november 2005 - 14:18 #4
vigtigt: den brug af EXEC forhindrer SQLServer i at optimere en SP
Avatar billede dpouls1 Nybegynder
19. november 2005 - 14:59 #5
Det vil jeg bruge som en alternativ løsning hvis det ikke er muligt at formatere strengen så den kan benyttes direkte i den eksisterende stored procedure.
Avatar billede arne_v Ekspert
31. december 2005 - 14:42 #6
jeg ligger et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester