2013-08-19 8 views
6

Podaje się oddzielone przecinkami liczby jako ciąg do procedury składowanej, parametry są używane w parametrze IN, jednak po uruchomieniu SP (z parametrami takimi jak "1 , 2") wyskakuje mi błąd:Przecinek oddzielający ciąg do liczby całkowitej, który ma być użyty w "IN" SQL

Conversion failed when converting the varchar value '1,2' to data type int.

procedura przechowywana jest:

ALTER PROCEDURE [Reports].[LocationSummary] 
    @dtFrom VARCHAR(MAX), 
    @dtTo VARCHAR(MAX), 
    @passTypeId VARCHAR(MAX), 
    @passCategoryId VARCHAR(MAX), 
    @passTransId VARCHAR(MAX), 
    @printOption VARCHAR(MAX), 
    @printLocationId VARCHAR(MAX) 
AS 
BEGIN 
    SELECT Admins.PLocations.ArabicName AS PLocationA, 
      Admins.PLocations.EnglishName AS PLocationE, 
      SUM(CASE WHEN Port.Info.Printed = 1 THEN 1 ELSE 0 END) AS Printed, 
      SUM(CASE WHEN Port.Info.Printed = 0 THEN 0 ELSE 1 END) AS NotPrinted, 
      SUM(CASE WHEN Port.PortPrintLog.PortId IS NOT NULL THEN 1 ELSE 0 END) AS Reprinted 

    FROM Port.Info INNER JOIN 
      Port.PortRequests ON 
      Port.Info.PassRequestId = Port.PortRequests.ID LEFT JOIN 
      Port.PortDefinitions ON 
      Port.PortRequests.PassDefinitionID = Port.PortDefinitions.ID INNER JOIN 
      Admins.PortCategories ON 
      Port.PortDefinitions.PassCategoryId = Admins.PortCategories.ID INNER JOIN 
      Admins.PortTypes ON 
      Port.PortDefinitions.PassTypeId = Admins.PortTypes.ID INNER JOIN 
      Admins.PortTransactionTypes ON 
      Port.PortDefinitions.PassTransactionTypeId = Admins.PortTransactionTypes.ID INNER JOIN 
      Admins.PLocations ON 
      Port.Info.PrintLocationID = Admins.PLocations.ID LEFT JOIN 
      Port.PortPrintLog ON Port.PortPrintLog.PortId = Port.Info.ID 

    WHERE 
     (@dtFrom IS NOT NULL AND Port.PortRequests.IssuanceDate IS NOT NULL AND Port.PortRequests.IssuanceDate >= @dtFrom) 
     AND (@dtTo IS NOT NULL AND Port.PortRequests.ExpiryDate IS NOT NULL AND Port.PortRequests.ExpiryDate <= @dtTo) 
     AND ((Admins.PortTypes.ID IN (CAST(@passTypeId AS INT))) 
     AND (Admins.PortCategories.ID IN (CAST(@passCategoryId))) 
     AND (Admins.PortTransactionTypes.ID IN (CAST(@passTransId))) 
     AND (Port.Info.PrintLocationID IN (CAST(@PrintLocationId AS INT)))) 

    GROUP BY Admins.PrintLocations.ArabicName, Admins.PrintLocations.EnglishName 

Jak mogę uniknąć tego błędu? czy powinienem użyć funkcji na ciąg znaków? Czy mogę zobaczyć przykład tej funkcji?

Odpowiedz

1

może mieć dynamiczny sql:

ALTER PROCEDURE [Reports].[LocationSummary] 
    @dtFrom VARCHAR(MAX), 
    @dtTo VARCHAR(MAX), 
    @passTypeId VARCHAR(MAX), 
    @passCategoryId VARCHAR(MAX), 
    @passTransId VARCHAR(MAX), 
    @printOption VARCHAR(MAX), 
    @printLocationId VARCHAR(MAX) 
AS 
    DECLARE @SQL AS VARCHAR(MAX) 
    SET @SQL = 
    'SELECT Admins.PLocations.ArabicName AS PLocationA, 
      Admins.PLocations.EnglishName AS PLocationE, 
      SUM(CASE WHEN Port.Info.Printed = 1 THEN 1 ELSE 0 END) AS Printed, 
      SUM(CASE WHEN Port.Info.Printed = 0 THEN 0 ELSE 1 END) AS NotPrinted, 
      SUM(CASE WHEN Port.PortPrintLog.PortId IS NOT NULL THEN 1 ELSE 0 END) AS Reprinted 

    FROM Port.Info INNER JOIN 
      Port.PortRequests ON 
      Port.Info.PassRequestId = Port.PortRequests.ID LEFT JOIN 
      Port.PortDefinitions ON 
      Port.PortRequests.PassDefinitionID = Port.PortDefinitions.ID INNER JOIN 
      Admins.PortCategories ON 
      Port.PortDefinitions.PassCategoryId = Admins.PortCategories.ID INNER JOIN 
      Admins.PortTypes ON 
      Port.PortDefinitions.PassTypeId = Admins.PortTypes.ID INNER JOIN 
      Admins.PortTransactionTypes ON 
      Port.PortDefinitions.PassTransactionTypeId = Admins.PortTransactionTypes.ID INNER JOIN 
      Admins.PLocations ON 
      Port.Info.PrintLocationID = Admins.PLocations.ID LEFT JOIN 
      Port.PortPrintLog ON Port.PortPrintLog.PortId = Port.Info.ID 

    WHERE 
     (@dtFrom IS NOT NULL AND Port.PortRequests.IssuanceDate IS NOT NULL AND Port.PortRequests.IssuanceDate >= @dtFrom) 
     AND (@dtTo IS NOT NULL AND Port.PortRequests.ExpiryDate IS NOT NULL AND Port.PortRequests.ExpiryDate <= @dtTo) 
     AND ((Admins.PortTypes.ID IN (' + @passTypeId + ')) 
     AND (Admins.PortCategories.ID IN (' + @passCategoryId + ')) 
     AND (Admins.PortTransactionTypes.ID IN (' + @passTransId + ')) 
     AND (Port.Info.PrintLocationID IN (' + @PrintLocationId + '))) 

    GROUP BY Admins.PrintLocations.ArabicName, Admins.PrintLocations.EnglishName' 

    EXEC (@SQL) 
0
ALTER PROCEDURE [Reports].[LocationSummary] 
    @dtFrom VARCHAR(MAX), 
    @dtTo VARCHAR(MAX), 
    @passTypeId VARCHAR(MAX), 
    @passCategoryId VARCHAR(MAX), 
    @passTransId VARCHAR(MAX), 
    @printOption VARCHAR(MAX), 
    @printLocationId VARCHAR(MAX) 
AS 
BEGIN 
    SELECT Admins.PLocations.ArabicName AS PLocationA, 
      Admins.PLocations.EnglishName AS PLocationE, 
      SUM(CASE WHEN Port.Info.Printed = 1 THEN 1 ELSE 0 END) AS Printed, 
      SUM(CASE WHEN Port.Info.Printed = 0 THEN 0 ELSE 1 END) AS NotPrinted, 
      SUM(CASE WHEN Port.PortPrintLog.PortId IS NOT NULL THEN 1 ELSE 0 END) AS Reprinted 

    FROM Port.Info INNER JOIN 
      Port.PortRequests ON 
      Port.Info.PassRequestId = Port.PortRequests.ID LEFT JOIN 
      Port.PortDefinitions ON 
      Port.PortRequests.PassDefinitionID = Port.PortDefinitions.ID INNER JOIN 
      Admins.PortCategories ON 
      Port.PortDefinitions.PassCategoryId = Admins.PortCategories.ID INNER JOIN 
      Admins.PortTypes ON 
      Port.PortDefinitions.PassTypeId = Admins.PortTypes.ID INNER JOIN 
      Admins.PortTransactionTypes ON 
      Port.PortDefinitions.PassTransactionTypeId = Admins.PortTransactionTypes.ID INNER JOIN 
      Admins.PLocations ON 
      Port.Info.PrintLocationID = Admins.PLocations.ID LEFT JOIN 
      Port.PortPrintLog ON Port.PortPrintLog.PortId = Port.Info.ID 

    WHERE 
     (@dtFrom IS NOT NULL AND Port.PortRequests.IssuanceDate IS NOT NULL AND Port.PortRequests.IssuanceDate >= @dtFrom) 
     AND (@dtTo IS NOT NULL AND Port.PortRequests.ExpiryDate IS NOT NULL AND Port.PortRequests.ExpiryDate <= @dtTo) 
     AND Admins.PortTypes.ID IN (@passTypeId) 
     AND Admins.PortCategories.ID IN (@passCategoryId) 
     AND Admins.PortTransactionTypes.ID IN (@passTransId) 
     AND Port.Info.PrintLocationID IN (@PrintLocationId) 

    GROUP BY Admins.PrintLocations.ArabicName, Admins.PrintLocations.EnglishName 

rzucania do int spowoduje błąd podczas przejazdu 1,2 w parametrze. nie rzucaj go.

+1

To zapytanie nie daje oczekiwanego rezultatu – Dhaval

0

Upewnij istnieją przestrzenie w swojej oddzielone przecinkiem listy:

(1,2) 

nie jest taka sama jak

(1, 2) 
4

@jyparask dał dynamiczny zapytanie, można użyć, które próbują w inny sposób w celu realizacji następujących logika. masz więcej niż jedną kolumnę, w przeciwnym razie dokonałem zmian.

Declare @var1 as varchar(2000) 
Declare @var2 as varchar(2000) 
Set @var1 = '31,39,41,45' 
Set @var2 = ',' + @var1 + ',' 
select * from Table1 Where Charindex(','+cast(Col1 as varchar)+',', @var2) > 0