Sql 对两个VarChar参数执行类似操作的能力

Sql 对两个VarChar参数执行类似操作的能力,sql,sql-server,sql-server-2008,tsql,stored-procedures,Sql,Sql Server,Sql Server 2008,Tsql,Stored Procedures,我有一张桌子,看起来像: orderID Code SubCode 基于代码和子代码,我需要能够提取所有OrderID 代码和子代码是varchar值,我需要能够对其执行“类似”操作,因为例如,用户可以访问代码的3%和子代码的45% 对于上面的示例,我将获得所有订单,其中code以3开头,而子代码以45开头 我只使用了代码,如下所示: ALTER PROCEDURE [sp_GetOrders] -- Add the parameters for the stored proced

我有一张桌子,看起来像:

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

代码
子代码
是varchar值,我需要能够对其执行“类似”操作,因为例如,用户可以访问
代码
的3%和
子代码
的45% 对于上面的示例,我将获得所有订单,其中
code
以3开头,而
子代码
以45开头

我只使用了
代码
,如下所示:

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
上面的方法是有效的,如果我将300%的代码传递给codeList,它会正确地返回所有orders id,这些orders id包含以300开头的代码,但是我现在如何在混合中包含子代码呢

我想如果我能够将代码和子RG作为一个参数传递会更好,这样就不会失去它们之间的关系,可能会出现类似“5%-6%”的破折号,其中5%是代码,6%是子RG。。但我不知道从哪里开始


从后端看,传递参数的格式不重要,我只需要知道如何使SP工作。

< P>您可以考虑将输入参数类型更改为<代码> 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
)

在SQLServer2008+中,您可以向SPs和UDF传递表值参数。表值参数允许您以表格格式向SPs和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

关于

的简单演示能否将参数类型更改为XML?这可能比xml选项更好,但我想知道子代码是否应该允许空值(在这种情况下匹配所有子代码)?感谢@Joel Coehoorn的反馈。如果参数对的值之一为空,则必须使用NULL值才能在表类型中使用(两列都允许NULL值)。因此,应更改程序主体(WHERE条款的搜索条件)。