Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将逗号分隔的字符串强制转换为整数,以便在“中使用”;在;SQL_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 将逗号分隔的字符串强制转换为整数,以便在“中使用”;在;SQL

Sql server 将逗号分隔的字符串强制转换为整数,以便在“中使用”;在;SQL,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我将逗号分隔的数字作为字符串传递给存储过程,参数在关键字中的中使用,但是当我执行SP时(使用类似“1,2”的参数),它会给我一个错误: 将varchar值“1,2”转换为数据类型时,转换失败 内部的 存储过程是: ALTER PROCEDURE [Reports].[LocationSummary] @dtFrom VARCHAR(MAX), @dtTo VARCHAR(MAX), @passTypeId VARCHAR(MAX), @passCategoryId

我将逗号分隔的数字作为字符串传递给存储过程,参数在关键字中的
中使用,但是当我执行SP时(使用类似“1,2”的参数),它会给我一个错误:

将varchar值“1,2”转换为数据类型时,转换失败 内部的

存储过程是:

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
ALTER程序[报告].[LocationSummary]
@从VARCHAR(最大值)开始的数据传输,
@dtTo VARCHAR(最大值),
@passTypeId VARCHAR(最大值),
@passCategoryId VARCHAR(最大值),
@PASSTRANID VARCHAR(最大值),
@打印选项VARCHAR(最大值),
@printLocationId VARCHAR(最大值)
作为
开始
选择Admins.PLocations.ArabicName作为PLocationA,
Admins.PLocations.EnglishName为PLocationE,
打印时的总和(Port.Info.Printed=1,则为1,否则为0),
未打印的总和(Port.Info.Printed=0,则为0,否则为1),
重新打印的总和(Port.PortPrintLog.PortId不为NULL时为1,否则为0结束)
从Port.Info内部连接
Port.PortRequests ON
Port.Info.PassRequestId=Port.PortRequests.ID左加入
上的端口定义
Port.PortRequests.PassDefinitionID=Port.PortDefinitions.ID内部联接
上的Admins.PortCategories
Port.PortDefinitions.PassCategoryId=Admins.PortCategories.ID内部联接
上的Admins.PortTypes
Port.PortDefinitions.PassTypeId=Admins.PortTypes.ID内部联接
上的Admins.PortTransactionTypes
Port.PortDefinitions.PassTransactionTypeId=Admins.PortTransactionTypes.ID内部联接
行政人员
Port.Info.PrintLocationID=Admins.PLocations.ID左连接
Port.PortPrintLog.PortId=Port.Info.ID上的Port.PortPrintLog
哪里
(@dtFrom不为NULL,Port.PortRequests.IssuanceDate不为NULL,Port.PortRequests.IssuanceDate>=@dtFrom)

和(@dtTo不为NULL,Port.PortRequests.ExpiryDate不为NULL,Port.PortRequests.ExpiryDate您可能有一个动态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)
ALTER程序[报告].[LocationSummary]
@从VARCHAR(最大值)开始的数据传输,
@dtTo VARCHAR(最大值),
@passTypeId VARCHAR(最大值),
@passCategoryId VARCHAR(最大值),
@PASSTRANID VARCHAR(最大值),
@打印选项VARCHAR(最大值),
@printLocationId VARCHAR(最大值)
作为
将@SQL声明为VARCHAR(MAX)
SET@SQL=
'选择Admins.PLocations.ArabicName作为PLocationA,
Admins.PLocations.EnglishName为PLocationE,
打印时的总和(Port.Info.Printed=1,则为1,否则为0),
未打印的总和(Port.Info.Printed=0,则为0,否则为1),
重新打印的总和(Port.PortPrintLog.PortId不为NULL时为1,否则为0结束)
从Port.Info内部连接
Port.PortRequests ON
Port.Info.PassRequestId=Port.PortRequests.ID左加入
上的端口定义
Port.PortRequests.PassDefinitionID=Port.PortDefinitions.ID内部联接
上的Admins.PortCategories
Port.PortDefinitions.PassCategoryId=Admins.PortCategories.ID内部联接
上的Admins.PortTypes
Port.PortDefinitions.PassTypeId=Admins.PortTypes.ID内部联接
上的Admins.PortTransactionTypes
Port.PortDefinitions.PassTransactionTypeId=Admins.PortTransactionTypes.ID内部联接
行政人员
Port.Info.PrintLocationID=Admins.PLocations.ID左连接
Port.PortPrintLog.PortId=Port.Info.ID上的Port.PortPrintLog
哪里
(@dtFrom不为NULL,Port.PortRequests.IssuanceDate不为NULL,Port.PortRequests.IssuanceDate>=@dtFrom)
和(@dtTo不为NULL,Port.PortRequests.ExpiryDate不为NULL,Port.PortRequests.ExpiryDate
ALTER PROCEDURE[Reports].[LocationSummary]
@从VARCHAR(最大值)开始的数据传输,
@dtTo VARCHAR(最大值),
@passTypeId VARCHAR(最大值),
@passCategoryId VARCHAR(最大值),
@PASSTRANID VARCHAR(最大值),
@打印选项VARCHAR(最大值),
@printLocationId VARCHAR(最大值)
作为
开始
选择Admins.PLocations.ArabicName作为PLocationA,
Admins.PLocations.EnglishName为PLocationE,
打印时的总和(Port.Info.Printed=1,则为1,否则为0),
未打印的总和(Port.Info.Printed=0,则为0,否则为1),
重新打印的总和(Port.PortPrintLog.PortId不为NULL时为1,否则为0结束)
从Port.Info内部连接
Port.PortRequests ON
Port.Info.PassRequestId=Port.PortRequests.ID左加入
上的端口定义
Port.PortRequests.PassDefinitionID=Port.PortDefinitions.ID内部联接
上的Admins.PortCategories
Port.PortDefinitions.PassCategoryId=Admins.PortCategories.ID内部联接
上的Admins.PortTypes
Port.PortDefinitions.PassTypeId=Admins.PortTypes.ID内部联接
上的Admins.PortTransactionTypes
Port.PortDefinitions.PassTransactionTypeId=Admins.PortTransactionTypes.ID内部联接
行政人员
Port.Info.PrintLocationID=Admins.PLocations.ID左连接
Port.PortPrintLog.PortId=Port.Info.ID上的Port.PortPrintLog
哪里
(@dtFrom不为NULL,Port.PortRequests.IssuanceDate不为NULL,Port.PortRequests.IssuanceDate>=@dtFrom)

和(@dtTo不为NULL,Port.PortRequests.ExpiryDate不为NULL,Port.PortRequests.ExpiryDate确保逗号分隔的列表中有空格:

(1,2)
不一样

(1, 2)

@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

此查询不会给出预期的结果
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