sql - 多个表的功能
问题描述
我有这个函数,但我想传递一个表以便使用相同的函数来完成多个表的工作。例如,我希望这个函数适用于 table1 和 table2。但它目前仅适用于 table1。我试图徒劳地使用动态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)
但我希望同样的功能也适用于 table2。
任何帮助表示赞赏。
解决方案
使用分区视图,这将允许您将表名指定为 where 子句中的参数。
首先创建一个合并两个表的视图,加上一个额外的列来指示该行来自哪个表。
CREATE VIEW BothTables AS
SELECT 'Table1' TableName, * FROM Table1
UNION ALL
SELECT 'Table2' TableName, * FROM Table2
然后修改你的函数。当您传递表名时,使用它从视图中选择行的子集。所以而不是
SELECT CAST('<X>'+REPLACE([name], ',', '</X><X>')+'</X>' AS XML) AS String
FROM table1
WHERE id = @id
利用
SELECT CAST('<X>'+REPLACE([name], ',', '</X><X>')+'</X>' AS XML) AS String
FROM BothTables
WHERE TableName = @TableName
AND id = @id