Создание команды SQL UPDATE, зная команду SELECT? - PullRequest
1 голос
/ 18 января 2012

Допустим, это мой запрос на выборку:

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, я получаю исключение из-за использования более чем одной таблицы в моем выборе.

Как бы выглядела команда UPDATE, если бы я захотел обновить таблицу CNEXTRA.CNVAL? И как я могу убедиться, что если CNVAL пуст, мне придется использовать команду INSERT?

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

В зависимости от вашей версии сервера SQL вы можете использовать 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)
;

A MERGE оператор выполнит обновление, если запись существует, или вставку, если ее нет.

0 голосов
/ 18 января 2012

Я не тестировал этот код, но что-то вроде этого должно работать ... (но вам нужно написать собственные запросы на вставку, обновление и удаление)

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...