【问题标题】:PHP MS SQL - Multiple value one field pass in a stored procedurePHP MS SQL - 在存储过程中传递多个值一个字段
【发布时间】:2018-02-06 08:34:58
【问题描述】:

我在使用 MS SQL 和 PHP 时遇到了一些麻烦。你能指导我吗?

这是我的故事:

我有一份交货报告。报告有过滤器。看看我的表格:

Delivery Report

现在过滤器工作正常。我可以检索数据。但是我的老板希望我的过滤器是每个字段的多个值。

例子:

在销售组字段中,如果我输入“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


    【解决方案1】:

    不幸的是,PHP MSSQL Driver 尚不支持表值参数。因此,您必须忍受将逗号分隔的字符串从 PHP 代码传递给存储过程。

    PHP MSSQL Driver支持的数据类型的更多细节

    使用内置函数 STRING_SPLIT 来获得所需的行为。

    你可以像下面这样实现你的代码。

    DECLARE @Codes NVARCHAR(400) = 'Code1,Code2,Code3,Code4,Code5'  
    
    SELECT * FROM [Your_Table] UT
    INNER JOIN
    (
    SELECT IN_Code  
    FROM STRING_SPLIT(@Codes, ',')  
    
    ) INPUT_DATA
    ON INPUT_DATA.IN_Code = UT.Code
    

    【讨论】:

    • 嗨 PSK。谢谢你的评论。它在我心中产生了一个想法。这是我尝试过的。我从 PHP 传递了字符串。例如:'01,07'。然后在 MS SQL 中,我将拆分字符串并将其插入表变量(@salesGroupTable)。所以'01, 07'字符串将变成两行,01和07。现在我的where子句有一个IN条件(),(SELECT salesGroup FROM @salesGroupTable)。它工作正常。但是如果没有提供任何字符串,我想检索所有数据。请查看我编辑的问题。非常感谢..
    • 加 1 mor 或 @input = ''
    • 销售组在哪里(从@salesgrouptable 中选择销售组)或@input=''
    • 嗨@PSK,谢谢。我按照你的建议做了。没事。这是工作。如果我提供了文本,它仍然会显示所有结果。你会看看我的新查询吗?我将替换我对我的问题的查询。谢谢...
    • 请看我的问题。我现在更改了查询并应用了您的建议。谢谢...
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 2023-01-06
    • 2020-07-13
    相关资源
    最近更新 更多