【发布时间】:2018-02-06 08:34:58
【问题描述】:
我在使用 MS SQL 和 PHP 时遇到了一些麻烦。你能指导我吗?
这是我的故事:
我有一份交货报告。报告有过滤器。看看我的表格:
现在过滤器工作正常。我可以检索数据。但是我的老板希望我的过滤器是每个字段的多个值。
例子:
在销售组字段中,如果我输入“01, 07”,所有来自销售组 01 和 07 的交货都会出现在表格中。目前我正在使用 LIKE 条件。
现在我的问题是,如何将逗号分隔的值传递到我的 MS SQL 存储过程中?
也许我的方法是错误的。还有其他方法可以做到这一点吗?是在 MS Sql 部分还是 PHP 部分?
这是我的 sql 查询:(更新:这是解决我的问题的最后一个查询。感谢 PSA)
-- inventoryDetailed '0', '10', '1', '', '', '', '02/01/2018', '02/28/2018'
-- inventoryDetailed '0', '10', '1', NULL, NULL, NULL, '01/01/2018', '05/31/2018'
-- exec inventoryDetailed 0, 10, 1, NULL, NULL, NULL, '01/01/2018', '07/28/2018'
ALTER PROCEDURE [dbo].[inventoryDetailed]
@start int,
@pageSize int,
@userId bigint,
@salesGroupCode nvarchar(10),
@salesOfficeCode nvarchar(10),
@salesDistrictCode nvarchar(10),
@DtRcvFrom DATETIME,
@DtRcvTo DATETIME
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @storeSalesGroup nvarchar(max)
DECLARE @salesGroupTable TABLE
(
salesGroup nvarchar(10)
)
SET @storeSalesGroup = @salesGroupCode
while len(@salesGroupCode) > 0
begin
--exec YourSP left(@S, charindex(',', @S+',')-1)
insert into @salesGroupTable values(left(@salesGroupCode, charindex(',', @salesGroupCode +',')-1))
set @salesGroupCode = stuff(@salesGroupCode, 1, charindex(',', @salesGroupCode+','), '')
end
SELECT d.SGrp as salesGroupCode,
d.SGrpNm as salesGroup,
d.SOffc as salesOfficeCode,
d.SOffcNm as salesOffice,
d.SDst as salesDistrictCode,
d.SDstNm as salesDistrict,
a.CustCode as customerCode,
d.CustNm as customer,
c.MatrlCode as materialCode,
c.MatDesc as material,
b.Qty as qty,
b.ExpDt as batch,
datepart(wk, a.DtRcv) as week,
a.DtRcv as dateRcvd,
e.LName + ', ' + e.FName as diser,
overall_count = COUNT(*) OVER()
FROM [BigEMerchandiser].[dbo].[tbl_Inventory_H] as a
INNER JOIN [BigEMerchandiser].[dbo].[tbl_Inventory_D] as b
ON a.TransCtr = b.TransCtr
INNER JOIN BigEMasterData.dbo.tbl_Materials as c
ON b.Material = c.ExtMatGrp
INNER JOIN BigEMasterData.dbo.tbl_Customers as d
ON a.CustCode = d.CustCode
inner JOIN [BigESentData].[dbo].[tbl_sentRegistration] as e
on a.CreatedBy = e.CellNum
inner join BigEUsers.dbo.user_role_area as f
on d.SDst = f.area_id
inner join BigEUsers.dbo.users as g
on f.role_id = g.role_id
WHERE datepart(wk, a.DtRcv) BETWEEN datepart(wk, @DtRcvFrom) AND datepart(wk, @DtRcvTo)
AND (d.SGrp IN (SELECT salesGroup from @salesGroupTable))
OR (ISNULL(@storeSalesGroup,'')='')
AND d.SOffc LIKE ISNULL('%' + @salesOfficeCode + '%', d.SOffc)
AND d.SDst LIKE ISNULL('%' + @salesDistrictCode + '%', d.SDst)
AND g.id = @userId
ORDER BY a.DtRcv desc
OFFSET @start ROWS
FETCH NEXT @pageSize ROWS ONLY;
END
任何提示和建议将不胜感激。非常感谢。
编辑:
感谢 PSK 的创意。
我所做的是从 PHP 传递字符串。示例:'01, 07'。
然后,在 MS SQL 中,我创建了一个表变量。
DECLARE @salesGroupTable TABLE
(
salesGroup nvarchar(10)
)
接下来,我将从 PHP ('01, 07') 传递过来的字符串进行拆分,然后将其插入到表变量中。
接下来,我将在我的 IN 条件中使用该表变量。
WHERE d.SGrp IN (SELECT salesGroup from @salesGroupTable)
现在,它工作正常。它按预期工作。
但如果用户没有输入任何内容,我必须返回所有结果。希望你能帮我解决这个问题。谢谢!
【问题讨论】:
标签: php sql-server stored-procedures