Функция для нескольких таблиц - PullRequest
0 голосов
/ 10 июля 2020

У меня есть эта функция, но я хотел передать таблицу, чтобы использовать ту же функцию для выполнения работы для нескольких таблиц. Например, я хочу, чтобы эта функция работала для table1 и table2. Но в настоящее время это только для table1. Я тщетно пытался использовать динамик c sql; он не передает выбранный параметр. Может кто поможет? Дайте мне руководство, как передать таблицу в качестве параметра.

Пример данных, table1

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

Это дает результат из таблицы 1.

SELECT * FROM F_SPLIT(1) 

Но я хочу, чтобы та же функция работала и для таблицы 2.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 11 июля 2020

Используйте секционированное представление , которое позволит вам указать имя таблицы в качестве параметра в предложении 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
...