【问题标题】:Function to multiple tables多个表的功能
【发布时间】:2020-07-10 20:06:11
【问题描述】:

我有这个函数,但我想传递一个表,以便使用相同的函数来完成多个表的工作。例如,我希望这个函数适用于 table1 和 table2。但它目前仅适用于 table1。我试图徒劳地使用动态sql;它没有传递选择的参数。 有人可以帮忙吗?指导我如何将表格作为参数传递。

示例数据,表 1

CREATE TABLE table1 (id int identity (1,1), name varchar(60)) 
INSERT INTO table1
VALUES ('a1, a2, a9, a8')

示例数据,table2

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

这给出了 table1 的结果。

SELECT * FROM F_SPLIT(1) 

但我希望同样的功能也适用于 table2。

感谢任何帮助。

【问题讨论】:

  • 你试过在网上搜索sql server dynamic sql这个词吗?
  • 我做了并尝试应用它。但我认为它不适用于函数。

标签: sql sql-server function tsql stored-functions


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2013-06-06
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2017-01-08
    • 2022-11-07
    • 2015-12-10
    • 2012-07-18
    相关资源
    最近更新 更多