2012-07-04 67 views
0

我找了类似于C#操作符的功能:http://msdn.microsoft.com/en-US/library/ty67wk28(v=vs.80TSQL:操作功能

我需要基于两个参数应用到过滤的服务器端数据:??

  1. @CountryIDs - 这是逗号分隔值列表,例如'27,28,81' - 意思是国家代码27,国家代码28和国家代码81

  2. @关键字匹配客户名称。

有时候我不想提供应选择CountryIDs的完整列表,而是我想要的一切选择 - 有点像“ ” 我创建了一个自定义函数“CSV2Table_fn”这使我可以提供像CountryID这样的CSV列表。

DECLARE @CountryIDs nvarchar(4000), @Keyword nvarchar(50) 
SET @CountryIDs = '25,28,81' 
SET @Keyword = null 


if (len(@Keyword) > 0) -- search for names matching keyword 
    begin 

     SELECT Name, CountryID FROM Company 
       WHERE CountryID IN (
       SELECT DISTINCT ItemValue FROM CSV2Table_fn(
         ISNULL((SELECT 
          CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0 THEN @CountryIDs 
          ELSE null 
          END 
        ),CountryID),',') 
      ) 
      AND Name LIKE '%' + @Keyword + '%'  

    end 
else -- no keyword provided 
    begin 

     SELECT Name, CountryID FROM Company 
     WHERE CountryID IN (
     SELECT DISTINCT ItemValue FROM CSV2Table_fn(
      ISNULL((SELECT 
         CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0 THEN @CountryIDs 
         ELSE null 
         END 
       ),CountryID),',') 
     ) 
       end 
  • 编辑:代码现在作为应该。然而,这不是很干净,而且可能会进行优化。
+1

见http://stackoverflow.com/questions/11291639/where-that-选择 - 所有的建议不这样做。 – GSerg

+0

@CountryIDs变量不是来自客户端,所以我不相信它应该是一个问题? – Sha

+0

你现在有什么建议作为这个问题的正确解决方案,而不是尝试写一个'where'。 – GSerg

回答

0

要允许空值和CSV的像“123,456,789”传递的是值我用这个@CountryIDs:

SELECT Name, CountryID FROM Company 
    WHERE CountryID IN ( 
    SELECT DISTINCT ItemValue FROM CSV2Table_fn( 
     ISNULL((SELECT 
        CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0 THEN @CountryIDs 
        ELSE null 
        END 
      ),CountryID),',') 
    ) 
1

你能不能做这样的事情:

SELECT Name, CountryID 
FROM Company 
WHERE CHARINDEX(',' + CONVERT(varchar(100), CountryID) + ',', ',' + ISNULL(@CountryIDs, CONVERT(varchar(100), CountryID)) + ',') > 0 
AND Name LIKE '%' + ISNULL(@Keyword, '') + '%' 

**编辑是有点简单,处理空@CountryIDs PARAM。

+0

如果null不提供,这将工作。我设法找到了我的原始代码的修复。我已经为您提供的代码添加了修复程序。 'SELECT Name,CountryID FROM Company WHERE CHARINDEX(','+ CAST(CountryID as nvarchar)+',','+'COUNTID +',')> 0 AND(Name LIKE'%' + @关键字+'%'或@关键字IS NULL)' – Sha

+0

如果不提供NULL作为什么? CountryID参数,Keyword参数还是列中的值?如果你想在某些情况下选择所有的CountryIDs,那么使用'WHERE(CHARINDEX(','+ CAST(CountryID as nvarchar)+',',','+ @CountryIDs +',')> 0 OR @ CountryIDs IS NULL)AND(Name LIKE'%'+ @Keyword +'%'OR @Keyword IS NULL)'。尽管如此,我并不是100%确定我遵循这个要求。 – Sean

+0

如果我想选择所有内容(不使用CountryID中的WHERE进行过滤),那么我会执行类似SET @CountryIDs = null的操作。这不适用于你的第一段代码(没有测试过你的第二段代码)......让我知道它是否合理。 – Sha