SVI*_*SVI 6 t-sql sql-server sql-server-2008
我将逗号分隔的数字作为字符串传递给存储过程,参数在IN关键字中使用,但是当我执行SP(参数如"1,2")时,它给出了一个错误:
将varchar值'1,2'转换为数据类型int时转换失败.
存储过程是:
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
Run Code Online (Sandbox Code Playgroud)
我该如何避免这个错误?我应该Split对字符串使用函数吗?我可以看一下该功能的一些例子吗?
@jyparask提供了动态查询,您可以使用它否则尝试实现以下逻辑。你有多于一栏,否则我做了改变。
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
Run Code Online (Sandbox Code Playgroud)
你可能有一个动态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)
Run Code Online (Sandbox Code Playgroud)