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条款的搜索条件)。