4

我有一个看起来像的表:

orderID  Code  SubCode

基于代码和子代码,我需要能够提取所有 orderID。

Codes并且SubCodes是 varchar 值,我需要能够对其进行“喜欢”,因为例如,对于上述示例,用户可以访问 3% forCode和 45% for SubCode for,我将获得所有订单以Code3SubCode开头,以 45 开头。

我已经让它Code像这样工作了:

ALTER PROCEDURE [sp_GetOrders]
    -- Add the parameters for the stored procedure here
@codeList varchar(max), 
@subCodeList varchar(max)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


declare @tempTable Table
(
SearchCode varchar(max)
)
insert  into @tempTable
select  * from dbo.udf_split(@codeList ) as split --this splits comma delimited list 'm passing in 

    -- Insert statements for procedure here
SELECT  orderID  from ordert t1
where
exists(
select 1 from @tempTable tt
where t1.userCode  like tt.SearchOrg
)
END

上面的方法有效,如果我为 codeList 传递 300%,它会正确返回所有具有以 300 开头的代码的订单 id,但是我现在如何在组合中包含 SubCode?

我想如果我能够将代码和子组织作为 1 个参数传递会更好,以免失去彼此之间的关系,可能会有像 '5%-6%' 这样的破折号,其中 5% 是代码,而 6 % suborg .. 但我什至不知道从哪里开始。

从后端,传递参数的格式无关紧要,我只需要弄清楚如何让 SP 工作。

4

2 回答 2

1

您可以考虑将输入参数类型更改为XML

XML 格式

DECLARE @inputXML AS XML = 
 '<ParameterList>
    <Parameter>
        <Code>300%</Code>
        <SubCode>5%</SubCode>
    </Parameter>
    <Parameter>
        <Code>10%</Code>
        <SubCode>6%</SubCode>
    </Parameter>
</ParameterList>'

您的存储过程将类似于

ALTER PROCEDURE [sp_GetOrders]
    @inputXML XML 
AS
BEGIN

SET NOCOUNT ON;

DECLARE @tempTable TABLE
(
SearchCode VARCHAR(100),
SearchSubCode VARCHAR(100)
)


INSERT  INTO @tempTable
SELECT
   Pars.value('(Code)[1]', 'Varchar(100)') AS Code,
   Pars.value('(SubCode)[1]', 'Varchar(100)') AS SubCode
FROM
   @inputXML.nodes('/ParameterList/Parameter') AS List(Pars)


SELECT  orderID  
FROM ordert t1
WHERE
EXISTS(
    SELECT 1 FROM @tempTable tt
    WHERE t1.userCode  LIKE tt.SearchCode
    AND t1.userSubCode LIKE tt.SearchSubCode
)
于 2013-04-10T20:32:43.260 回答
1

在 SQLServer2008+ 中,您可以将表值参数传递给 SP 和 UDF。表值参数允许您以表格格式将数据行传递给您的 SP 和 UDF。要创建表值参数,您必须首先创建定义表结构的表类型。

CREATE TYPE dbo.CodeSubCodeValueType
AS TABLE (Code nvarchar(100) NOT NULL, SubCode nvarchar(100) NOT NULL)
GO

ALTER PROCEDURE [sp_GetOrders]
 (@CodeSubCodeValueType dbo.CodeSubCodeValueType READONLY)
AS
BEGIN    
  SET NOCOUNT ON;

  SELECT orderID
  FROM ordert t1
  WHERE EXISTS(
               SELECT 1 
               FROM @CodeSubCodeValueType tt               
               WHERE t1.userCode LIKE tt.Code
                 AND t1.userSubCode LIKE tt.SubCode
               )
END
GO

使用表值参数调用过程

DECLARE @CodeSubCodeValueType dbo.CodeSubCodeValueType

INSERT @CodeSubCodeValueType
VALUES('5%', '6%'), 
      ('7%', '8%')

EXEC [sp_GetOrders] @CodeSubCodeValueType

如果参数对的值之一为空,则在表类型中使用 NULL 值是必要的:

CREATE TYPE dbo.CodeSubCodeValueType
AS TABLE (Code nvarchar(100), SubCode nvarchar(100))
GO

ALTER PROCEDURE [sp_GetOrders]
 (@CodeSubCodeValueType dbo.CodeSubCodeValueType READONLY)
AS
BEGIN    
  SET NOCOUNT ON;

  SELECT orderID
  FROM ordert t1
  WHERE EXISTS(
               SELECT 1 
               FROM @CodeSubCodeValueType tt               
               WHERE t1.Code LIKE ISNULL(tt.Code, t1.Code)
                 AND t1.SubCode LIKE ISNULL(tt.SubCode, t1.SubCode)
               )
END
GO

SQLFiddle上的简单演示

于 2013-04-10T21:26:51.550 回答