传递多个字符串和多个值作为参数

时间:2014-10-08 19:46:39

标签: sql-server tsql

我搜索了很多论坛和网站,但却未能找到解决方案。也许我不是在寻找正确的东西 - 但任何方向和帮助都会受到赞赏!

我正在尝试加入两个表:UserDataServiceStatsUserData由以下列和示例数据组成:

Title           Application
------------    -------------
Site Manager    KB1245;KB3256
FTP_Viewer      FTP1536

ServiceStats由以下列和示例数据组成:

ApplicationName    Vendor
---------------    ------------
KB1245             Kronos
KB3256             Kronos2
FTP1536            File Manager

加入表时,我需要获得类似于以下内容的输出:

Site Manager  KB1245   Kronos
Site Manager  KB3256   Kronos2
FTP_Viewer    FTP1536  File Manager

我的问题是让联接阅读并识别ApplicationNames多个Title

再次 - 感谢任何帮助和指导。

2 个答案:

答案 0 :(得分:0)

我可以削减OP一些松懈。作为开发人员,我们必须处理其他人做出的不太理想的决策。 OP应该搜索的是如何拆分分隔字符串,StackOverflow上有大量字符串。

我的解决方案:

;WITH
    cte1 AS (
        SELECT  Title,
                REPLACE(Application,' ','') + ';' AS Application
        FROM    UserData
    ),
    cte2 AS (
        SELECT  Title,
                LEFT(Application,CHARINDEX(';',Application)-1)      AS ApplicationName,
                STUFF(Application,1,CHARINDEX(';',Application),'')  AS RemainingApp
        FROM    cte1
        UNION ALL
        SELECT  Title,
                LEFT(RemainingApp,CHARINDEX(';',RemainingApp)-1),
                STUFF(RemainingApp,1,CHARINDEX(';',RemainingApp),'')
        FROM    cte2
        WHERE   LEN(RemainingApp) > 0
    )

SELECT  c2.Title,
        c2.ApplicationName,
        s.Vendor
FROM    cte2    c2
INNER JOIN ServiceStats s ON c2.ApplicationName = s.ApplicationName

答案 1 :(得分:0)

我更喜欢使用表值函数,它允许我加入它。当我不得不使用它时,这也使我的代码更小:

ALTER FUNCTION [dbo].[Split](@String VARCHAR(8000), @Delimiter CHAR(1))       
RETURNS @temptable TABLE (item VARCHAR(8000))       
AS       
BEGIN       
    DECLARE @idx INT       
    DECLARE @slice VARCHAR(8000)        
    SELECT @idx = 1       
    IF len(@String)<1 OR @String IS NULL  RETURN       
    while @idx!= 0       
    BEGIN       
        SET @idx = charindex(@Delimiter,@String)       
        IF @idx!=0       
            SET @slice = LEFT(@String,@idx - 1)       
        ELSE       
            SET @slice = @String       
        IF(len(@slice)>0)  
            INSERT INTO @temptable(Item) VALUES(@slice)       
        SET @String = RIGHT(@String,len(@String) - @idx)       
        IF len(@String) = 0 break       
    END   
    RETURN       
END

然后使用它:

SELECT * FROM dbo.Split('1;2;3;4;5',';')

它就像一张桌子,所以你甚至可以加入它:

SELECT * 
FROM dbo.Split('1;2;3;4;5',';') a
INNER JOIN MyTable b ON a.item = b.Field1