sql-server - 将逗号分隔的字符串转换为要在 "IN"SQL 中使用的整数

标签 sql-server sql-server-2008 tsql

我将逗号分隔的数字作为字符串传递给存储过程,参数用于IN关键字,但是当我执行 SP(带有“1,2”等参数)时,它给了我一个错误:

Conversion failed when converting the varchar value '1,2' to data type 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

如何避免该错误?我应该使用一个函数 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

关于sql-server - 将逗号分隔的字符串转换为要在 "IN"SQL 中使用的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18309949/

相关文章:

sql - 使用 MS SQL Identity 是一个好的做法吗?

sql-server - 如何获取所有用户定义数据类型的脚本

sql - 连接多个表返回重复项

sql-server - 获取查询返回的总行数

sql - 通过SQL语句手动插入到表中,但键是自动递增的

sql - 旋转单行列 T-SQL

sql - T-SQL : Deleting all duplicate rows but keeping one

sql - 统计和基数估计 - 为什么我会看到这个结果?

sql-server - 哪些设置提供 SQL Server 默认日期时间格式?

sql - 使用 where 子句在 SQL Server 中进行透视