2014-09-26 85 views
0

分離爲數組參數一串數字我想創建一個具有以下參數的存儲過程:@WorkspaceID int如何返回由逗號在SQL

我現在是這樣的:

DECLARE @WorkspaceRuleIds varchar(max) 

SELECT @WorkspaceRuleIds = COALESCE(@WorkspaceRuleIds + ', ', '') + 
    CAST(RuleID AS varchar(5)) 
FROM Dgn_Workspace_Rules 
WHERE WorkspaceID = @WorkspaceID; 

SELECT ag.* 
FROM Dgn_Rules ag 
LEFT JOIN Dgn_Workspace_Rules wr ON ag.RuleID IN (@WorkspaceRuleIds) 
WHERE wr.WorkspaceID = @WorkspaceID 

如果@WorkspaceID收到的25則ag.RuleID IN (80,82)價值應該得到的參數...但我得到這個錯誤,而不是

消息245,級別16,狀態1,第3行
將nvarchar值'80,82'轉換爲數據類型int時轉換失敗。

我該如何解決這個問題?謝謝!

+1

語法和錯誤看起來像SQL Server,但你標記'mysql'。這是什麼? – 2014-09-26 07:11:38

+0

SQL Server,對不起! – 2014-09-26 07:13:19

+0

將X聲明爲varchar,設置X ='1,2,3,a,list,with,commas'; X中有多少個整數? (答案:零)你有一個varchar參數,所以它如何神奇地變成一系列整數?忘記它看起來像什麼,想想定義。 – 2014-09-26 07:14:04

回答

0

感謝球員,但..我發現我的問題的答案。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION [dbo].[CSVToTable] (@InStr VARCHAR(MAX)) 
RETURNS @TempTab TABLE 
    (id int not null) 
AS 
BEGIN 
    ;-- Ensure input ends with comma 
    SET @InStr = REPLACE(@InStr + ',', ',,', ',') 
    DECLARE @SP INT 
DECLARE @VALUE VARCHAR(1000) 
WHILE PATINDEX('%,%', @INSTR) <> 0 
BEGIN 
    SELECT @SP = PATINDEX('%,%',@INSTR) 
    SELECT @VALUE = LEFT(@INSTR , @SP - 1) 
    SELECT @INSTR = STUFF(@INSTR, 1, @SP, '') 
    INSERT INTO @TempTab(id) VALUES (@VALUE) 
END 
    RETURN 
END 
GO 

然後執行此:

DECLARE @WorkspaceRuleIds varchar(max) 

SELECT @WorkspaceRuleIds = COALESCE(@WorkspaceRuleIds + ', ', '') + 
    CAST(RuleID AS varchar(5)) 
FROM Dgn_Workspace_Rules 
WHERE WorkspaceID = @WorkspaceID; 

SELECT 
ag.* 
FROM 
Dgn_Rules ag 
LEFT JOIN 
Dgn_Workspace_Rules wr 
ON 
ag.RuleID IN (SELECT * FROM dbo.CSVToTable(@WorkspaceRuleIds)) 
WHERE 
wr.WorkspaceID = @WorkspaceID 

它輸出正是我需要的。

4
  1. 有幾個衆所周知的連接行值的技術。請閱讀Concatenating Row Values in Transact-SQL瞭解每種產品的優缺點。

  2. ag.RuleID IN (@WorkspaceRuleIds)這不會做任何接近你的期望。這不是一個宏觀替代。它是對標量值爲@WorkspaceRuleIds的謂詞IN的檢查。因此根據Data Type Precedence Rules@WorkspaceRuleIds將被強制爲int。這會導致您看到的投射錯誤。

  3. 您的查詢完全沒有意義。加入條件?

  4. 從不在SQL中使用逗號分隔的列表。 從不

0

嘗試下面的查詢您的幫助

SELECT 
    ag.* 
FROM Dgn_Rules AS ag 
LEFT JOIN Dgn_Workspace_Rules AS wr ON wr.RuleID = ag.RuleID 
WHERE wr.WorkspaceID = @WorkspaceID 
+2

只有在您仔細考慮您是否樂意接受其含義的特定情況下,才能應用「NOLOCK」。鑑於它沒有出現在問題中,並且在問題中沒有提及鎖定,爲什麼它突然出現在您的答案中? – 2014-09-26 08:10:12