2012-01-18 113 views
1

比方说,这是我的选择查询:通过了解SELECT命令来建立SQL UPDATE命令?

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#对一个DataGrid该查询的结果绑定。但是,当我尝试使用SQLDataAdapter的“自动更新”命令时,由于在select中使用了多个表,我得到一个异常。

如果我想更新CNEXTRA.CNVAL表,那么UPDATE命令将如何?我怎么能确保,如果CNVAL是空的,我将不得不使用INSERT命令?

谢谢你的帮助。

+0

的SQL Server(MSSQL,甲骨文,)在MS SQL Server中,一些基于联接的视图定义将允许您执行更新。 – 2012-01-18 16:23:40

+0

这是一个MSSQL DB – oopbase 2012-01-18 16:26:39

+0

哪个版本的sql server? – NotMe 2012-01-18 16:46:05

回答

2

根据您的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将如果存在记录进行更新或插入。

+0

不幸的是,MSSQL服务器不支持MERGE命令......有没有其他的机会来实现这一点? – oopbase 2012-01-19 18:27:31

+0

@ Forlan07:你的下一个最好的选择是编写一个select语句来查看记录是否存在,然后决定是否定期插入或更新。 – NotMe 2012-01-19 18:29:57

+0

好吧,我将我的数据库的兼容级别更改为100,因此此命令有效。但由于某种原因,如果我更新CNVAL,该命令将更新设置了ATRBT的每一列。所以语句不检查CON是否等于target.Name?这怎么可能? – oopbase 2012-01-25 13:15:49

0

我没有测试代码,但这样的事情应该工作...(但你需要编写自己的插入,更新和删除查询)

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; 
     } 
    } 
}