我嘗試沒有成功改變迭代/光標查詢(也就是工作的罰款)爲關係集查詢,以實現更好的性能。
我有什麼:
表1
| ID | NAME |
|----|------|
| 1 | A |
| 2 | B |
| 3 | C |
使用功能,我想我的數據插入到另一個表。下面的函數是一個簡化的例子:
功能
CREATE FUNCTION fn_myExampleFunction
(
@input nvarchar(50)
)
RETURNS @ret_table TABLE
(
output nvarchar(50)
)
AS
BEGIN
IF @input = 'A'
INSERT INTO @ret_table VALUES ('Alice')
ELSE IF @input = 'B'
INSERT INTO @ret_table VALUES ('Bob')
ELSE
INSERT INTO @ret_table VALUES ('Foo'), ('Bar')
RETURN
END;
我的預期的結果是在表2中插入數據如下所示:
表2
| ID | NAME |
|----|-------|
| 1 | Alice |
| 2 | Bob |
| 3 | Foo |
| 3 | Bar |
爲了達到這個目的,我嘗試了一些CTE(通用表表達式)和關係查詢,但都沒有按照需要工作。到目前爲止,我唯一的工作解決方案是一種迭代式而非表現性解決方案。
我目前工作的解決方案:
BEGIN
DECLARE
@ID int,
@i int = 0,
@max int = (SELECT COUNT(name) FROM table1)
WHILE (@i < @max) -- In this example, it will iterate 3 times
BEGIN
SET @i += 1
-- Select table1.ID where row_number() = @i
SET @ID =
(SELECT
id
FROM
(SELECT
id,
ROW_NUMBER() OVER (ORDER BY id) as rn
FROM
table1) rows
WHERE
rows.rn = @i
)
-- Insert into table2 one or more rows related with table1.ID
INSERT INTO table2
(id, name)
SELECT
@ID,
fn_result.output
FROM
fn_myExampleFunction (
(SELECT name FROM table1 WHERE id = @ID)
) fn_result
END
END
的目標是達到同樣不通過的ID迭代。
這是正確的答案 – Kik 2014-09-12 22:32:55
@Laurence,謝謝!我真正的功能很複雜(分割字符串),你的建議會更適合我。 – Zanon 2014-09-12 23:26:47