当您需要检查多个值时,如何按位置传递参数的值?
How do you pass values for a parameter by position when you need to check multiple values?
我创建了一个带有 2 个可选参数的存储过程 (spBalanceRange)。它们已被设置为默认值,当我按位置为每个参数仅传递 1 个值时,sp 工作正常。但是,我有一种情况,我试图按位置传递两个字符串,紧接着是一个通配符。我希望用户能够搜索以 'C%' 或 'F%' 开头的供应商名称。这是 CREATE PROC 语句的要点:
CREATE PROC spBalanceRange
@VendorVar varchar(40) = '%',
@BalanceMin money = 1.0
...
以下是我目前已经尝试过但不起作用的方法:
EXEC spBalanceRange '(C%|F%)', 200.00;
EXEC spBalanceRange 'C%|F%', 200.00;
有没有办法在按位置传递时使用通配符检查 2 个或更多字符串值?谢谢
编辑:根据您的评论,您只查找供应商名称的第一个字母。
在这种特殊情况下,我可以建议一种简单但性能不佳但非常简单的方法。 CHARINDEX
returns 大于零的数字,如果字符出现在字符串中。因此,您只需将所有查找优先字符作为简单的 "chain":
传递
DECLARE @DummyVendors TABLE(VendorName VARCHAR(100));
INSERT INTO @DummyVendors VALUES
('Camel Industries')
,('Fritz and Fox')
,('some other');
DECLARE @ListOfFirstLetters VARCHAR(100)='CF';
SELECT VendorName
FROM @DummyVendors AS dv
WHERE CHARINDEX(LEFT(dv.VendorName,1),@ListOfFirstLetters)>0
这是之前的回答
检查多个值需要一个专门的比较列表
WHERE val=@prm1 OR val=@prm2 OR ... (you know the count before)
...或者您使用 IN 子句
WHERE LEFT(VenoderName,1) IN ('C','F', ...)
...但是您不能使用 ... IN(@allValues)
之类的参数传递 IN 列表
您可能会考虑创建一个 TYPE 来传递您的所有值,例如 table 并使用 INNER JOIN
作为过滤器:(以及那里的许多其他示例。 ..)
或者您可能会想到动态 SQL:
最后但同样重要的是,您可能会想到许多拆分字符串的方法之一。这是我自己的回答之一,第 "dynamic IN-statement" 节:
我正在回答我自己的问题,也许还有其他解决方案,但为了按位置传递变量,我的存储过程必须这样做:
CREATE PROC spBalanceRange
@VendorVar varchar(40) = '%',
@BalanceMin money = 1.0
AS
IF (@VendorVar = '%' AND @BalanceMin IS NULL OR @BalanceMin = '')
BEGIN
PRINT 'BalanceMin cannot be null.';
END
IF (@VendorVar = % AND @BalanceMin IS NOT NULL)
BEGIN
(sql statement using parameters)
END
EXEC spBalanceRange '[C,F]%', 200.00;
这就是我所知道的。
我创建了一个带有 2 个可选参数的存储过程 (spBalanceRange)。它们已被设置为默认值,当我按位置为每个参数仅传递 1 个值时,sp 工作正常。但是,我有一种情况,我试图按位置传递两个字符串,紧接着是一个通配符。我希望用户能够搜索以 'C%' 或 'F%' 开头的供应商名称。这是 CREATE PROC 语句的要点:
CREATE PROC spBalanceRange
@VendorVar varchar(40) = '%',
@BalanceMin money = 1.0
...
以下是我目前已经尝试过但不起作用的方法:
EXEC spBalanceRange '(C%|F%)', 200.00;
EXEC spBalanceRange 'C%|F%', 200.00;
有没有办法在按位置传递时使用通配符检查 2 个或更多字符串值?谢谢
编辑:根据您的评论,您只查找供应商名称的第一个字母。
在这种特殊情况下,我可以建议一种简单但性能不佳但非常简单的方法。 CHARINDEX
returns 大于零的数字,如果字符出现在字符串中。因此,您只需将所有查找优先字符作为简单的 "chain":
DECLARE @DummyVendors TABLE(VendorName VARCHAR(100));
INSERT INTO @DummyVendors VALUES
('Camel Industries')
,('Fritz and Fox')
,('some other');
DECLARE @ListOfFirstLetters VARCHAR(100)='CF';
SELECT VendorName
FROM @DummyVendors AS dv
WHERE CHARINDEX(LEFT(dv.VendorName,1),@ListOfFirstLetters)>0
这是之前的回答
检查多个值需要一个专门的比较列表
WHERE val=@prm1 OR val=@prm2 OR ... (you know the count before)
...或者您使用 IN 子句
WHERE LEFT(VenoderName,1) IN ('C','F', ...)
...但是您不能使用 ... IN(@allValues)
您可能会考虑创建一个 TYPE 来传递您的所有值,例如 table 并使用 INNER JOIN
作为过滤器:(以及那里的许多其他示例。 ..)
或者您可能会想到动态 SQL:
最后但同样重要的是,您可能会想到许多拆分字符串的方法之一。这是我自己的回答之一,第 "dynamic IN-statement" 节:
我正在回答我自己的问题,也许还有其他解决方案,但为了按位置传递变量,我的存储过程必须这样做:
CREATE PROC spBalanceRange
@VendorVar varchar(40) = '%',
@BalanceMin money = 1.0
AS
IF (@VendorVar = '%' AND @BalanceMin IS NULL OR @BalanceMin = '')
BEGIN
PRINT 'BalanceMin cannot be null.';
END
IF (@VendorVar = % AND @BalanceMin IS NOT NULL)
BEGIN
(sql statement using parameters)
END
EXEC spBalanceRange '[C,F]%', 200.00;
这就是我所知道的。