2012-07-04 70 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