多表的sql函数

nkhmeac6  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(321)

我有这个函数,但我想传递一个表,以便使用同一个函数完成多个表的工作。例如,我希望这个函数适用于表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。
感谢您的帮助。

az31mfrm

az31mfrm1#

使用分区视图,这将允许您将表名指定为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

相关问题