【问题标题】:Looping table valued parameter values passed as parameter to stored procedure for checking a value循环表值参数值作为参数传递给存储过程以检查值
【发布时间】:2015-09-01 04:57:11
【问题描述】:
我有一个接收 TVP 作为输入的存储过程。现在,我需要检查主键列中特定 ID 的接收数据。如果它存在,那么我只需要使用其他列的这些新值(通过 TVP 发送)来更新表。否则,做一个插入。
怎么做?
CREATE PROCEDURE ABC
@tvp MyTable READONLY
AS
IF EXISTS (SELECT 1 FROM MYTAB WHERE ID= @tvp.ID)
DO update
ELSE
Create
只是想知道我所做的if exists 循环是正确的。我认为它是错误的,因为它只会检查第一个值然后更新。其他值呢?我应该如何循环这个?
【问题讨论】:
标签:
sql-server
tsql
stored-procedures
table-valued-parameters
【解决方案1】:
循环/CURSOR 是万不得已的武器,始终寻找SET based 的解决方案,而不是ROW based。
您应该使用专为此类操作设计的MERGE:
MERGE table_name AS TGT
USING (SELECT * FROM @tvp) AS SRC
ON TGT.id = SRC.ID
WHEN MATCHED THEN
UPDATE SET col = SRC.col
WHEN NOT MATCHED THEN
INSERT (col_name, col_name2, ...)
VALUES (SRC.col_name1, SRC.col_name2, ...)
如果您不喜欢 MERGE,请使用 INSERT/UPDATE:
UPDATE table_name
SET col = tv.col,
...
FROM table_name AS tab
JOIN @tvp AS tv
ON tab.id = tv.id
INSERT INTO table_name(col1, col2, ...)
SELECT tv.col1, tv.col2, ...
FROM table_name AS tab
RIGHT JOIN @tvp AS tv
ON tab.id = tv.id
WHERE tab.id IS NULL