【问题标题】:T-SQL: How to dynamize this Join-Function?T-SQL:如何动态化这个 Join-Function?
【发布时间】:2011-07-11 17:28:19
【问题描述】:

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

比如这个datamodel(函数其实不需要知道tabData,这里只是为了完整性添加):

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

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 拆分为一个表(例如,'1,2,3,4' 分成单独的行)。现在我需要相反的(比如编程中的String.Join(separator,array))。

为了完整起见,这里是拆分 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  

提前谢谢你:)

【问题讨论】:

  • 您还有多少张其他桌子需要这个设施?
  • @shahkalpesh:刚刚有 7 个表,但将来可能会更多,而且有时我想要另一个 dest-column,而不是函数中定义的。我只是在寻找一个 String.Join(separator,array)-Function,就像在 T-SQL 编程中一样。编辑了我的问题以进行澄清。

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


【解决方案1】:

这可能会有所帮助:

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

【讨论】:

  • 我没有“varchar-array”,我只有两个加入的表(一个主数据和一个关系表)并在外键上过滤(见上图)。所以我的“数组”是一个结果表。这已经奏效了,但我正在寻找一种方法来动态化它以实现重用。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 2020-12-31
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多