能够对两个VarChar参数进行LIKE

时间:2013-04-10 19:47:26

标签: sql sql-server sql-server-2008 tsql stored-procedures

我有一张表格如下:

orderID  Code  SubCode

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

CodesSubCodes是varchar值,我需要能够在其上执行“喜欢”,因为用户可以访问{{1}的3% }和Code的45% 对于上面的示例,我将获得SubCode以3开头且Code以45开头的所有订单。

我已经让它像SubCode一样工作:

Code

以上的工作,如果我为codeList传递了300%,它会正确返回所有具有以300开头的代码的订单ID,但我现在如何在混合中包含SubCode?

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

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

2 个答案:

答案 0 :(得分: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
)

答案 1 :(得分: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

如果参数couple之一为空,则在表类型中使用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

上的简单演示