SQL where 子句中的函数以查看字段是否在串联列表中(来自参数)
SQL Function inside of where clause to see if field is in concatenated list (from parameter)
我有这两行
,SUM (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN 1 ELSE 0 END) OVER () Orders1DayNotShipped
,dbo.GROUP_CONCAT( (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN Customer_Purchase_Order_Number END)) OVER () Orders1DayNotShippedString
第一行统计当天未发货的订单数量。
第二行使用 Group_Concat 函数(在此处找到:https://archive.codeplex.com/?p=groupconcat)来 return 那些延迟订单的订单号列表。
这是一个示例结果:91149220、91155318、91155319 等
现在我要做的是获取 result/field 然后通过 SSRS 将其传递给另一个报告。我可以轻松地将此参数传递给其他报告,我只需要一些帮助使其真正起作用。我希望第二份报告获取这些订单号并向我显示所有这些订单。
所以对于我的第二份报告,我设置了参数,这就是我尝试为我的 where 子句做的事情
WHERE 1=1
...
AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in dbo.[Z_N_CSVToList](@LocalOrderList)))
Z_N_CSVToList 是一个将字符串分解为列表的简单函数。就是这样:
ALTER FUNCTION [dbo].[Z_N_CSVToList] (@CSV varchar(MAX))
RETURNS @Result TABLE (Value varchar(300))
AS
BEGIN
DECLARE @List TABLE
(
Value varchar(300)
)
DECLARE
@Value varchar(300),
@Pos int
SET @CSV = LTRIM(RTRIM(@CSV))+ ','
SET @Pos = CHARINDEX(',', @CSV, 1)
IF REPLACE(@CSV, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @Value = LTRIM(RTRIM(LEFT(@CSV, @Pos - 1)))
IF @Value <> ''
INSERT INTO @List (Value) VALUES (@Value)
SET @CSV = RIGHT(@CSV, LEN(@CSV) - @Pos)
SET @Pos = CHARINDEX(',', @CSV, 1)
END
END
INSERT @Result
SELECT
Value
FROM
@List
RETURN
END
我该如何进行这项工作? 运行 它现在的状态给我错误 "Incorrect syntax near 'dbo'."
我是否必须在组连接行中的订单号周围添加引号?
编辑:我明白了。如果我将我的 where 子句更改为此,它会起作用。
AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in (Select * from dbo.[Z_N_CSVToList](@LocalOrderList))))
但现在我的报告只是 return 列表中的第一个订单,而不是所有订单。知道为什么吗?
应该是这样的使用exists
AND (@LocalOrderList IS NULL OR
(exists (select 1 from dbo.[Z_N_CSVToList](@LocalOrderList) v
where Customer_Purchase_Order_Number = v.value
)))
我有这两行
,SUM (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN 1 ELSE 0 END) OVER () Orders1DayNotShipped
,dbo.GROUP_CONCAT( (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN Customer_Purchase_Order_Number END)) OVER () Orders1DayNotShippedString
第一行统计当天未发货的订单数量。 第二行使用 Group_Concat 函数(在此处找到:https://archive.codeplex.com/?p=groupconcat)来 return 那些延迟订单的订单号列表。
这是一个示例结果:91149220、91155318、91155319 等
现在我要做的是获取 result/field 然后通过 SSRS 将其传递给另一个报告。我可以轻松地将此参数传递给其他报告,我只需要一些帮助使其真正起作用。我希望第二份报告获取这些订单号并向我显示所有这些订单。
所以对于我的第二份报告,我设置了参数,这就是我尝试为我的 where 子句做的事情
WHERE 1=1
...
AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in dbo.[Z_N_CSVToList](@LocalOrderList)))
Z_N_CSVToList 是一个将字符串分解为列表的简单函数。就是这样:
ALTER FUNCTION [dbo].[Z_N_CSVToList] (@CSV varchar(MAX))
RETURNS @Result TABLE (Value varchar(300))
AS
BEGIN
DECLARE @List TABLE
(
Value varchar(300)
)
DECLARE
@Value varchar(300),
@Pos int
SET @CSV = LTRIM(RTRIM(@CSV))+ ','
SET @Pos = CHARINDEX(',', @CSV, 1)
IF REPLACE(@CSV, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @Value = LTRIM(RTRIM(LEFT(@CSV, @Pos - 1)))
IF @Value <> ''
INSERT INTO @List (Value) VALUES (@Value)
SET @CSV = RIGHT(@CSV, LEN(@CSV) - @Pos)
SET @Pos = CHARINDEX(',', @CSV, 1)
END
END
INSERT @Result
SELECT
Value
FROM
@List
RETURN
END
我该如何进行这项工作? 运行 它现在的状态给我错误 "Incorrect syntax near 'dbo'."
我是否必须在组连接行中的订单号周围添加引号?
编辑:我明白了。如果我将我的 where 子句更改为此,它会起作用。
AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in (Select * from dbo.[Z_N_CSVToList](@LocalOrderList))))
但现在我的报告只是 return 列表中的第一个订单,而不是所有订单。知道为什么吗?
应该是这样的使用exists
AND (@LocalOrderList IS NULL OR
(exists (select 1 from dbo.[Z_N_CSVToList](@LocalOrderList) v
where Customer_Purchase_Order_Number = v.value
)))