在SQL Server中为特定表生成UPDATE语句

时间:2018-12-03 23:57:46

标签: sql-server

我想知道是否有一种工具可以根据已插入表中的数据生成UPDATE语句。我知道有MERGE条语句,但我想知道是否可以用另一种方法。我正在使用SQL Server 2014

假设我有一个TableA:

Id int,
Name nvarchar(50),
Description nvarchar(100),
Active bit

然后我的TableA拥有此记录和更多内容:

Id   Name       Description   Active
1    blablabla  sdjfhksj      1

我要为此表上的每一行创建更新语句

Update TableA
   set Name = 'blablabla',
       Description = 'sdjfhksj',
       Active = 1
 where Id = 1

4 个答案:

答案 0 :(得分:2)

当然有很多通往罗马的道路,但是下面是MSSQL中的灵活存储过程。 它使用带有WHERE子句的常规SELECT语句作为输入,然后输出Insert语句和update语句的列表。 它们一起形成了一种IF NOT EXISTS()INSERT ELSE UPDATE 当有不可更新的列需要从最终INSERT / UPDATE语句中排除时,它也很方便。 (“ MSSQL生成脚本”无法做到)

下面的脚本可以做的另一件事是,它甚至可以处理其他表的INNER JOIN作为存储过程的输入语句。 作为穷人的发布管理工具,它可能很方便。 当然,对于那些想要更多的人来说,应付款替代品也在市场上。

state = 
{   
    name:"mjpatel"  
    parsedFilter:
    {
      page:2,
      perPage:4,
      totalPages: 50,
    }
}

答案 1 :(得分:1)

一种快速,简便且有效的解决方案是使用SQL生成脚本

SELECT ('UPDATE thetable SET 
          Name=''' + Name + ''', 
          Description =''' + REPLACE(Description, CHAR(39), CHAR(39)+CHAR(39))  + ''', 
          Active  =' + Active + ';
       ')  AS update_statement
FROM TableA

添加您的WHERE子句以过滤脚本中所需的行

诀窍是正确处理数据中的单引号(又称CHAR(39))。

我认为您的Description列可能包含单引号,因此我用REPLACE()将它们加倍,因此当您抛出结果SQL指令时,其包含将被正确地转义。对可能包含单引号的所有字段执行相同的技巧

答案 2 :(得分:0)

您要解决什么问题?

插入将起作用吗?Check out the answer to this question

特别是:

Right-click on the database and go to Tasks > Generate Scripts.
Select the tables (or objects) that you want to generate the script against.
Go to Set scripting options tab and click on the Advanced button.
In the General category, go to Type of data to script
There are 3 options: Schema Only, Data Only, and Schema and Data. Select the appropriate option and click on OK.

然后您将获得CREATE TABLE语句和所有INSERT语句,用于直接从SSMS中获取数据。

答案 3 :(得分:0)

您可以使用xml路径生成更新查询

    SET NOCOUNT ON;

DECLARE @TableName NVARCHAR(500) = 'YOUR_Table_Name'
DECLARE @XmlTbl TABLE(XVal XML)

INSERT INTO @XmlTbl
EXEC('SELECT (SELECT * FROM ' + @TableName + '
    FOR XML PATH(''T''))')

DECLARE @Xml AS XML = (SELECT XVal FROM @XmlTbl)

DECLARE @T TABLE(ID INT IDENTITY(1,1), XmlVal XML)
INSERT INTO @T
SELECT 
    C.query('.')
FROM 
@Xml.nodes('T') AS T(C)

WHILE EXISTS(SELECT * FROM @T)
BEGIN
    DECLARE @ID INT = (SELECT TOP 1 ID FROM @T)
    DECLARE @RowXml XML = (SELECT TOP 1 XmlVal FROM @T)
    DECLARE @PK NVARCHAR(500)
        =(
            SELECT COLUMN_NAME
            FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
            WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
            AND TABLE_NAME = @TableName AND TABLE_SCHEMA = 'dbo'
        )
    DECLARE @UpdateQuery NVARCHAR(MAX) =
    'UPDATE ' + @TableName + ' SET ' +
    STUFF((
        SELECT 
            ',' + C.value('local-name(.)', 'nvarchar(100)') + '=' + 
            (CASE WHEN C.value(N'.', 'nvarchar(MAX)') = 'NULL' THEN 'NULL' ELSE '''' + C.value(N'.', 'nvarchar(MAX)') + '''' END)
        FROM 
            @RowXml.nodes('T/*') AS T(C)
        FOR XML PATH('')
    ), 1, 1, '')
    + 'WHERE ' + @PK + '=' + 
    (
        SELECT 
            '''' + C.value(N'.', 'nvarchar(MAX)') + ''''
        FROM
            @RowXml.nodes('T/*') AS T(C)
        WHERE
            C.value('local-name(.)', 'nvarchar(100)') = @PK
    )

    PRINT @UpdateQuery

    DELETE FROM @T WHERE ID = @ID
END