Sql server 获取特定项的id后不返回任何值的存储过程

Sql server 获取特定项的id后不返回任何值的存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我有这样一个存储过程: ALTER PROCEDURE [dbo].[T_TransactionSummary] @startDate datetime, @endDate datetime, @locations nvarchar(50) AS BEGIN DECLARE @fromDate datetime

我有这样一个存储过程:

ALTER PROCEDURE [dbo].[T_TransactionSummary]  
                        @startDate datetime,  
                        @endDate datetime,       
                        @locations nvarchar(50)      
AS
BEGIN
    DECLARE @fromDate datetime = CONVERT(varchar(10), @startDate, 121) + ' 00:00:00.000';
    DECLARE @toDate datetime = CONVERT(varchar(10), @endDate, 121) + ' 11:59:59.999';

    SELECT
        COUNT(*) AS CarCount,
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-') AS Date_time,
        CASE Transaction_tbl.Compl
            WHEN 'True' THEN 'Complementary'   
            WHEN 'False' THEN 'Non-Complementary'
            ELSE 'Other'
        END AS Expr1,
        VType_tbl.Vtype,
        CASE
            WHEN (VType_tbl.Vtype = 'Normal' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 50
            WHEN (VType_tbl.Vtype = 'VIP' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 100
            ELSE 0
        END AS Total,
        CASE
            WHEN Transaction_tbl.Paid = 'False' THEN 0
            ELSE SUM(Transaction_tbl.PAmount)
        END AS CIH
    FROM
        Transaction_tbl INNER JOIN
        Location_tbl ON (Transaction_tbl.Locid = Location_tbl.Locid) LEFT OUTER JOIN  
        VType_tbl ON (Transaction_tbl.vtid = VType_tbl.vtid) LEFT OUTER JOIN  
        Make_tbl ON (Transaction_tbl.mkid = Make_tbl.mkid) LEFT OUTER JOIN  
        Color_tbl ON (Transaction_tbl.Colid = Color_tbl.colid) LEFT OUTER JOIN  
        PlateSource_tbl ON (Transaction_tbl.PSID = PlateSource_tbl.PSID)  
    WHERE
        (Transaction_tbl.dtime BETWEEN @fromDate AND @toDate)   
    AND (Location_tbl.Locid IN (SELECT locid FROM location_tbl WHERE locname IN (@locations)))  
    GROUP BY
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-'),
        VType_tbl.Vtype, Transaction_tbl.Compl, Transaction_tbl.Paid  
    ORDER BY
        Location_tbl.LocName,
        Date_time DESC,
        VType_tbl.Vtype,
        Transaction_tbl.Compl  
END
@startDate = '2013-01-01',
@endDate = '2013-10-01',
@locations = 'Blooming Dale,Fashion Avenue'
我传递的日期和地点如下:

ALTER PROCEDURE [dbo].[T_TransactionSummary]  
                        @startDate datetime,  
                        @endDate datetime,       
                        @locations nvarchar(50)      
AS
BEGIN
    DECLARE @fromDate datetime = CONVERT(varchar(10), @startDate, 121) + ' 00:00:00.000';
    DECLARE @toDate datetime = CONVERT(varchar(10), @endDate, 121) + ' 11:59:59.999';

    SELECT
        COUNT(*) AS CarCount,
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-') AS Date_time,
        CASE Transaction_tbl.Compl
            WHEN 'True' THEN 'Complementary'   
            WHEN 'False' THEN 'Non-Complementary'
            ELSE 'Other'
        END AS Expr1,
        VType_tbl.Vtype,
        CASE
            WHEN (VType_tbl.Vtype = 'Normal' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 50
            WHEN (VType_tbl.Vtype = 'VIP' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 100
            ELSE 0
        END AS Total,
        CASE
            WHEN Transaction_tbl.Paid = 'False' THEN 0
            ELSE SUM(Transaction_tbl.PAmount)
        END AS CIH
    FROM
        Transaction_tbl INNER JOIN
        Location_tbl ON (Transaction_tbl.Locid = Location_tbl.Locid) LEFT OUTER JOIN  
        VType_tbl ON (Transaction_tbl.vtid = VType_tbl.vtid) LEFT OUTER JOIN  
        Make_tbl ON (Transaction_tbl.mkid = Make_tbl.mkid) LEFT OUTER JOIN  
        Color_tbl ON (Transaction_tbl.Colid = Color_tbl.colid) LEFT OUTER JOIN  
        PlateSource_tbl ON (Transaction_tbl.PSID = PlateSource_tbl.PSID)  
    WHERE
        (Transaction_tbl.dtime BETWEEN @fromDate AND @toDate)   
    AND (Location_tbl.Locid IN (SELECT locid FROM location_tbl WHERE locname IN (@locations)))  
    GROUP BY
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-'),
        VType_tbl.Vtype, Transaction_tbl.Compl, Transaction_tbl.Paid  
    ORDER BY
        Location_tbl.LocName,
        Date_time DESC,
        VType_tbl.Vtype,
        Transaction_tbl.Compl  
END
@startDate = '2013-01-01',
@endDate = '2013-10-01',
@locations = 'Blooming Dale,Fashion Avenue'

但是我没有得到任何值…我的存储过程出了什么问题

我认为这是因为您在@locations参数中传递逗号分隔的值,并希望SQL server能够处理它。。SQL server不会自动处理此问题,您需要将条件更改为Charindex'、“+castlocname as varchar+”、“、@locations>0,这是我在以下逻辑中完成的,或者您需要编写动态查询

您可以尝试以下存储过程吗

ALTER PROCEDURE [dbo].[T_TransactionSummary]  
                        @startDate datetime,  
                        @endDate datetime,       
                        @locations nvarchar(50)      
AS
BEGIN
    DECLARE @fromDate datetime = CONVERT(varchar(10), @startDate, 121) + ' 00:00:00.000';
    DECLARE @toDate datetime = CONVERT(varchar(10), @endDate, 121) + ' 11:59:59.999';

    SELECT
        COUNT(*) AS CarCount,
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-') AS Date_time,
        CASE Transaction_tbl.Compl
            WHEN 'True' THEN 'Complementary'   
            WHEN 'False' THEN 'Non-Complementary'
            ELSE 'Other'
        END AS Expr1,
        VType_tbl.Vtype,
        CASE
            WHEN (VType_tbl.Vtype = 'Normal' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 50
            WHEN (VType_tbl.Vtype = 'VIP' AND Transaction_tbl.Compl = 'False') THEN COUNT(*) * 100
            ELSE 0
        END AS Total,
        CASE
            WHEN Transaction_tbl.Paid = 'False' THEN 0
            ELSE SUM(Transaction_tbl.PAmount)
        END AS CIH
    FROM
        Transaction_tbl INNER JOIN
        Location_tbl ON (Transaction_tbl.Locid = Location_tbl.Locid) LEFT OUTER JOIN  
        VType_tbl ON (Transaction_tbl.vtid = VType_tbl.vtid) LEFT OUTER JOIN  
        Make_tbl ON (Transaction_tbl.mkid = Make_tbl.mkid) LEFT OUTER JOIN  
        Color_tbl ON (Transaction_tbl.Colid = Color_tbl.colid) LEFT OUTER JOIN  
        PlateSource_tbl ON (Transaction_tbl.PSID = PlateSource_tbl.PSID)  
    WHERE
        (Transaction_tbl.dtime BETWEEN @fromDate AND @toDate)   
    AND (Location_tbl.Locid IN (SELECT locid FROM location_tbl WHERE Charindex(','''+cast(locname as varchar)+''',', @locations) > 0))  
    GROUP BY
        Location_tbl.LocName,
        REPLACE(CONVERT(varchar(11), Transaction_tbl.dtime, 113), ' ', '-'),
        VType_tbl.Vtype, Transaction_tbl.Compl, Transaction_tbl.Paid  
    ORDER BY
        Location_tbl.LocName,
        Date_time DESC,
        VType_tbl.Vtype,
        Transaction_tbl.Compl  
END

这真的很难读!!!一般来说,这只是一个提示:如果你确保你问的问题的格式是易于阅读的,您还提供了相关信息,如数据库结构和一些示例数据,有人会花更多时间来帮助您的可能性更大。我知道我在这行中的错误:和Location_tbl.Locid中的SELECT Locid FROM Location_tbl WHERE locname in@locations@user2878851Dhaval是正确的,“@locations”有问题-您也是正确的-在包含in的行中有一个问题。问题中显示的代码将获取您的位置值,并将它们放在输入后的括号之间。。。但每个值周围没有单引号,如列表中所要求的那样。Dhaval的代码旨在通过完全替换。。。虽然我想知道CHARINDEX是否可以简单地称为“Charindexlocname,@locations”