【发布时间】:2018-09-26 02:49:53
【问题描述】:
我有一个存储过程,我在其中发送一个用户定义的类型,它是一个表。我已经简化以使其更易于阅读。
CREATE TYPE [dbo].[ProjectTableType] AS TABLE(
[DbId] [uniqueidentifier] NOT NULL,
[DbParentId] [uniqueidentifier] NULL,
[Description] [text] NULL
)
CREATE PROCEDURE [dbo].[udsp_ProjectDUI] (@cmd varchar(10),
@tblProjects ProjectTableType READONLY) AS BEGIN
DECLARE @myNewPKTable TABLE (myNewPK uniqueidentifier)
IF(LOWER(@cmd) = 'insert')
BEGIN
INSERT INTO
dbo.Project
(
DbId,
DbParentId,
Description)
OUTPUT INSERTED.DbId INTO @myNewPKTable
SELECT NEWID(),
DbParentId,
Description
FROM @tblProjects;
SELECT * FROM dbo.Project WHERE dbid IN (SELECT myNewPK FROM @myNewPKTable);
END
这是用于其他应用程序将使用的 DLL,因此我们不一定负责验证。我想模仿 BULK INSERT,如果其中一行无法插入,但其他行很好,则仍然会插入正确的行。有没有办法做到这一点?我也想为 UPDATE 做这件事,如果一个失败,存储过程将继续尝试更新其他的。
我能想到的唯一选择是一次只做一个(要么是代码中的循环,其中存储过程被多次调用,要么是存储过程中的循环),但想知道性能会受到什么影响或者如果有更好的解决方案。
【问题讨论】:
标签: sql-server tsql bulkinsert