【问题标题】:Building a SQL UPDATE command by knowing the SELECT command?通过了解 SELECT 命令构建 SQL UPDATE 命令?
【发布时间】:2012-01-18 16:08:45
【问题描述】:

假设这是我的选择查询:

SELECT
    CNDSC.NAME,
    CNEA.ATRBT AS ATR,
    ISNULL(CNEXTRA.CNVAL,'') AS CNVAL,
    ISNULL(CNEXTRA.INRDR,'') AS INRDR
FROM
    CNDSC
    INNER JOIN CNEA
        ON CNEA.ELEMS LIKE '%'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%' AND
           NOT CNEA.ELEMS LIKE '%1'+CAST(CNDSC.FNCELEM AS VARCHAR)+'%'  
    LEFT OUTER JOIN CNEXTRA
        ON CNEXTRA.ATR LIKE CNEA.ATRBT AND
           CNEXTRA.NAME LIKE @con
WHERE
    CNDSC.NAME LIKE @con;

我正在使用 C# 将该查询的结果绑定到数据网格上。但是当我尝试使用 SQLDataAdapter 的“自动更新”命令时,由于在我的选择中使用了多个表,我得到了一个异常。

如果我想更新 CNEXTRA.CNVAL 表,UPDATE 命令会是什么样子?如果 CNVAL 为空,我如何确保必须使用 INSERT 命令?

感谢您的帮助。

【问题讨论】:

  • 哪个 SQL 服务器(MSSQL、Oracle、???) 在 MS SQL Server 中,一些基于连接的视图定义将允许您执行更新。

标签: c# sql sql-server sql-update


【解决方案1】:

根据您的 SQL Server 版本,您可以使用 MERGE 代替 UPDATE。

类似:

DECLARE @CNVAL varchar(100) = 'test'
DECLARE @ATRBT varchar(100) = 'some attribute'
DECLARE @CON varchar(100) = 'the name'

MERGE into CNEXTRA as target
  USING ( VALUES( @CON, @ATRBT, @CNVAL))
      AS source([Name], ATRBT, CNVAL)
      ON (target.ATRBT = source.ATRBT)
      AND (target.[Name] = source.[Name])
  WHEN MATCHED THEN
     UPDATE SET
        CNVAL = source.CNVAL
  WHEN NOT MATCHED THEN
     INSERT([Name], ATRBT, CNVAL)
     VALUES(source.[Name], source.ATRBT, source.CNVAL)
;

如果记录存在,MERGE statement 将执行更新,如果不存在,则执行插入。

【讨论】:

  • 不幸的是MSSQL服务器不支持MERGE命令...还有其他机会实现这一点吗?
  • @Forlan07:下一个最好的选择是编写一个 select 语句来查看记录是否存在,然后决定是从那里进行常规插入还是更新。
  • 好的,我将数据库的兼容级别更改为 100,所以此命令有效。但由于某种原因,如果我更新 CNVAL,该命令将更新设置 ATRBT 的每一列。所以该语句不检查 CON 是否等于 target.Name?这怎么可能?
  • 在不使用联接中使用的表时,我是否也有可能丢失一些数据?
  • @Forlan07:用一些示例数据发布您的实际表结构。
【解决方案2】:

我还没有测试过这段代码,但是这样的东西应该可以工作......(但你需要编写自己的插入、更新和删除查询)

public static DataSet UpdateSqlRows(
    string connectionString, 
    string selectQuery,
    string insertQuery,
    string updateQuery,
    string deleteQuery,
    DataSet dataSet)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlDataAdapter adapter = new SqlDataAdapter())
        {
            adapter.SelectCommand = new SqlCommand(selectQuery, connection);

            connection.Open();

            SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

            // Assign your own Insert/Update/Delete commands
            adapter.InsertCommand = new SqlCommand( insertQuery );
            adapter.UpdateCommand = new SqlCommand( updateQuery );
            adapter.DeleteCommand = new SqlCommand( deleteQuery );

            //Without the SqlCommandBuilder this line would fail
            adapter.Update(dataSet);

            return dataSet;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2023-04-11
    • 2014-09-09
    • 2013-11-09
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多