首页 > 解决方案 > 多个表的功能

问题描述

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

任何帮助表示赞赏。

标签: sqlsql-serverfunctiontsqlstored-functions

解决方案


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

推荐阅读