Question

J'ai posé une question à ce sujet, mais je n'arrive toujours pas à comprendre comment faire fonctionner cela. J'ai regardé quelques exemples dans lesquels des personnes ont utilisé des fonctions, des variables de table, créé des types et n'arrivent pas vraiment à faire fonctionner cela, alors je me demande si quelqu'un pourrait m'aider et peut-être expliquer un un peu du code qu'ils écrivent si c'est compliqué.

J'utilise Visual Studio 2012 pour créer des rapports et avoir sur le rapport une liste déroulante remplie de noms de sociétés qu'un utilisateur peut cocher pour afficher des informations sur chacune des sociétés.

Ce que je veux faire, c'est obtenir tous les identifiants d'entreprise de cette liste déroulante et les transmettre dans une clause In dans mon instruction SQL Where.Il s'agit d'une version simplifiée de ce que j'ai, je suis nouveau dans ce domaine, alors j'essaie juste de voir ce qui fonctionne lorsque je devrai examiner des choses plus complexes à l'avenir.

Idéalement, la ligne que j'ai commentée sera la ligne qui devrait être utilisée et les valeurs transmises, mais j'ai ajouté la ligne équivalente en dessous de laquelle j'ai utilisé pour les tests, j'obtiens une erreur sur la virgule entre 1,2 et

error message syntax error near ','.

Si quelqu'un peut aider à faire fonctionner cela en utilisant le @companynameParam que j'ai commenté, ce serait génial.CompanyNameParam est le nom de la liste déroulante du rapport VS.

Declare @ContactID int

--set @ContactID = @CompanyNameParam
set @ContactID = 1,2,3,4,5,6,7,8,9


select CompanyName as 'reportcompanyname'
from company co inner join contacts c on c.CompanyID = co.CompanyID
where ContactID in (@ContactID);
Était-ce utile?

La solution

Vous obtenez une erreur parce que SET la commande est utilisée pour attribuer single / scalar valeur à une seule variable à la fois et vous essayez d'attribuer multiple comma separated string valeurs à un single integer variable @ContactID en une seule fois.

L'approche correcte consiste à déclarer d'abord un local variable de type varchar et pas Int car @companynameParam doit être une chaîne.

Declare @ContactID varchar(500);

Convertissez ensuite la chaîne séparée par des virgules en tableau.[Il peut y avoir plusieurs façons de procéder] Je donne juste un exemple.Créez une fonction définie par l'utilisateur comme :

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[CSVToTable] (@InStr VARCHAR(MAX))
RETURNS @TempTab TABLE
   (id int not null)
AS
BEGIN
        SET @InStr = REPLACE(@InStr + ',', ',,', ',')
    DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @INSTR ) <> 0 
BEGIN
   SELECT  @SP = PATINDEX('%,%',@INSTR)
   SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
   SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
   INSERT INTO @TempTab(id) VALUES (@VALUE)
END
    RETURN
END
GO

Une fois cela fait, vous pouvez réécrire le sproc comme :

select CompanyName as 'reportcompanyname'
from company co inner join contacts c on c.CompanyID = co.CompanyID
where ContactID in (SELECT * FROM dbo.CSVToTable(@CompanyNameParam));

Vérifier DÉMO ici..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top