我有这个函数,但我想传递一个表,以便使用同一个函数完成多个表的工作。例如,我希望这个函数适用于表1和表2。但目前只适用于表1。我尝试使用动态sql是徒劳的;它不会传递选定的参数。有人能帮忙吗?告诉我如何将表作为参数传递。
样本数据,表1
CREATE TABLE table1 (id int identity (1,1), name varchar(60))
INSERT INTO table1
VALUES ('a1, a2, a9, a8')
样本数据,表2
CREATE TABLE table2 (id int identity (1,1), name varchar(60))
INSERT INTO table2
VALUES ('a1, a2, a9, a8')
功能:
CREATE FUNCTION f_split
(@id INT)
RETURNS @ab
TABLE (name VARCHAR(20),
ab1 VARCHAR(5)
)
AS
BEGIN
DECLARE @temp TABLE (rn INT, name VARCHAR(5))
INSERT INTO @temp(rn, name)
SELECT ROW_NUMBER() OVER(ORDER BY LTRIM(RTRIM(Split.a.value('.', 'NVARCHAR(MAX)'))) ASC) rn, LTRIM(RTRIM(Split.a.value('.', 'NVARCHAR(MAX)'))) Result
FROM
(
SELECT CAST('<X>'+REPLACE([name], ',', '</X><X>')+'</X>' AS XML) AS String
FROM table1 where id = @id
) AS A
CROSS APPLY String.nodes('/X') AS Split(a)
ORDER BY 1
INSERT INTO @ab
SELECT * FROM @temp
RETURN
END
这给出了表1的结果。
SELECT * FROM F_SPLIT(1)
但我希望同样的函数也适用于表2。
感谢您的帮助。
1条答案
按热度按时间az31mfrm1#
使用分区视图,这将允许您将表名指定为where子句中的参数。
首先创建一个视图来合并这两个表,再加上一列来指示行来自哪个表。
然后修改你的函数。传递表名时,使用它从视图中选择行的子集。所以
使用