当您需要检查多个值时,如何按位置传递参数值?

时间:2016-02-13 21:59:26

标签: sql sql-server stored-procedures optional-parameters

我创建了一个带有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个或更多字符串值?感谢。

2 个答案:

答案 0 :(得分:1)

编辑:根据您的意见,您正在寻找供应商名称的第一个字母。

在这个特殊情况下,我可以建议一个简单,表现不佳但非常简单的方法。如果字符出现在字符串中,CHARINDEX将返回大于零的数字。因此,您只需要将所有查找优先字符作为一个简单的"链传递#34;:

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传递所有值,例如表格,并使用INNER JOIN作为过滤器:https://stackoverflow.com/a/337864/5089204(还有许多其他示例......)

或者您可能会想到动态SQL:https://stackoverflow.com/a/5192765/5089204

最后但并非最不重要的是,您可能会想到许多分裂字符串方法中的一种。这是我自己的答案之一,部分"动态IN语句":https://stackoverflow.com/a/33658220/5089204

答案 1 :(得分:0)

我正在回答我自己的问题,也许还存在其他解决方案,但这是我的存储过程必须发生的事情才能按位置传递变量:

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;

这就是我所知道的。