首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SERVER按表值参数插入/更新表记录

问SERVER按表值参数插入/更新表记录
EN

Stack Overflow用户
提问于 2018-07-30 12:04:02
回答 2查看 1.2K关注 0票数 1

我有以表值参数作为输入的存储过程。它大约有15-20根柱子。我想在不合并的情况下执行insert / update,因为合并时表上有锁。此外,通过做研究,我知道,游标也可以使用。但是游标会降低性能。我发现了这篇文章( https://www.dotnettricks.com/learn/sqlserver/sql-server-cursor-alternatives ),在than循环中我们得到了每个列变量,对于列大于10的表来说,这将是很乏味的。那么,我还有其他选择吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-31 09:19:56

您可以创建一个存储过程并传递参数,如下所示:

代码语言:javascript
复制
CREATE PROCEDURE [dbo].[MyStoredProcedure]
    @TableValue [dbo].[TABLETYPE] READONLY
AS
BEGIN
    UPDATE [dbo].[MyTable]
    SET Name = T.Name
    FROM [dbo].[MyTable]
        INNER JOIN @TableValue AS T ON T.Id = [dbo].[MyTable].Id
    WHERE T.Name <> [dbo].[MyTable].Name

    INSERT INTO [dbo].[MyTable](Id,Name)
    SELECT Id , Name
    FROM @TableValue AS T
    WHERE NOT EXISTS(SELECT *
                     FROM [dbo].[MyTable] 
                     WHERE Id = T.Id)
END
GO

首先更新现有记录,然后插入新行。

票数 0
EN

Stack Overflow用户

发布于 2018-07-30 12:59:59

我给你做了个样本。这很简单。您可以将其放入存储过程中:

代码语言:javascript
复制
DECLARE @TABLE_NAME VARCHAR(100)
DECLARE @TABLE_NAME_DEST VARCHAR(100)
DECLARE @List VARCHAR(8000)
DECLARE @SQL VARCHAR(4000)

SET @TABLE_NAME = 'Employee'
SET @TABLE_NAME_DEST = 'Employee_DEST'

SELECT @List = COALESCE(@List + ', ', '') + Column_Name 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME
-- Prevent Injection
IF (EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TABLE_NAME )) 
BEGIN
SET @SQL = 'INSERT INTO [' + @TABLE_NAME_DEST +'] (' + @List +')' +char(10)
SET @SQL = @SQL + 'SELECT ' + @List + char(10) + 'FROM ' + @TABLE_NAME

print @SQL
END

类似于SQL。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51593575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档