【发布时间】: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