T-SQL:如何动态化这个连接函数?

时间:2011-03-09 08:54:10

标签: sql sql-server-2005 tsql user-defined-functions

我在SQL-Server 2005中使用了UDF。它正在连接一个表,并使用分隔符将所有行连接到一个标量值。因为我也需要它用于其他表,我想知道如何使它动态,以便它采用FK,分隔符,关系表名和目标列名。

例如这个数据模型(该函数实际上不需要知道tabData,只是为了在这里添加完整性): enter image description here

我想要动态化的静态标量值函数是:

CREATE FUNCTION [dbo].[getTabDataSymptomCodes]
(
    @idData Int,
    @delimiter varchar(5)
)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Codes VARCHAR(8000) 
    SELECT   @Codes = COALESCE(@Codes + @delimiter, '') + tdefSymptomCode.SymptomCodeNumber
    FROM    trelData_SymptomCode INNER JOIN
            tdefSymptomCode ON trelData_SymptomCode.fiSymptomCode = tdefSymptomCode.idSymptomCode
    WHERE     (trelData_SymptomCode.fiData = @idData)
    ORDER BY tdefSymptomCode.SymptomCodeNumber
    return @Codes
END

此函数简单地将行连接到一个用分隔符分隔的varchar值,例如'0345:0550:0700:1230'其中:是分隔符。

修改以澄清: 我已经有一个UDF,它将一个由char分隔的给定varchar分成一个表(f.e。'1,2,3,4'分成不同的行)。现在我需要相反的东西(比如编程中的String.Join(separator,array))。

为了完整起见,这是Split-UDF:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

提前谢谢你:)

1 个答案:

答案 0 :(得分:0)

可能会有所帮助:

Create FUNCTION [dbo].[StringJoin]
(
    @Seperator      char,
    @Array          varchar(200)
)
RETURNS nvarchar(256)
AS
BEGIN
    DECLARE
    @rv         varchar(200)
    select @rv=REPLACE(@Array,@Seperator,'')    
    RETURN @rv
END