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”