2011-10-01 2 views
0

Я пытаюсь написать запрос UPDATE, который может проверить нулевое значение в одном из полей. У меня три условия: два являются обязательными, из трех полей. itemCode и itemCheckDigit всегда будут существовать, itemSuffix - возможно Null.инструкция по обновлению, не выполняющая

Может быть несколько записей, где itemCode и itemCheckDigit вместе с другими записями, itemSuffix - это идентификатор unquie, только один экземпляр будет существовать, если itemSuffix - Null, и он никогда не будет дублироваться.

UPDATE item 
SET   itemImageFileName = ''' + @fileName + ''' 
WHERE  (itemCode = ''' + @itemCode5 + ''') AND (itemCheckDigit = ''' + @itemCkDigit + ''') AND (itemSuffix IS NULL); 

Это то, что я думаю, что хотел бы сделать, но он не работает.

+0

Очевидно что-то в вашей ИНЕКЕ является сдерживающим UPDATE. Временно преобразуйте его в SELECT и удалите предикаты из WHERE, пока не получите результаты. Тогда вы выделите проблему. –

+1

Я думаю, что я определил часть вашей проблемы, но если вы хотите синхронизировать свое описание с предоставленным кодом (столбцы не совпадают), мы можем работать с вашими проблемами сравнения NULL. – billinkc

+0

Попытка вашего предложения сейчас, у меня есть подозрение, что это имеет отношение к Null. Является ли это подходящим синтаксисом для проверки нулевого значения в поле? – htm11h

ответ

2

Ваша проблема заключается в том, что вы оберточные засечки вокруг ваших параметров в вашем заявлении так, когда он оценил ее ищет вещи из таблицы элементов, где Артикул является «игрушкой» (обратите внимание на одинарные кавычки)

Строки конкатенация вы делаете то, как можно было бы плохо добавить параметры в свои динамические запросы. Вместо этого возьмите клещ выделяет как и

UPDATE 
    item 
SET 
    itemImageFileName = @fileName 
WHERE 
    (itemCode = @itemCode5) 
    AND (itemCheckDigit = @itemCkDigit) 
    AND (itemSuffix IS NULL); 

Для обработки дополнительных параметров поиска, в этой статье Билл Грациано отлично: Using Dynamic SQL in Stored Procedures. Я считаю, что это хороший баланс между тем, чтобы избежать повторной компиляции запросов при настройке параметра перекомпиляции и избежать сканирования таблиц.

Пожалуйста, наслаждайтесь этим кодом. Он создает временную таблицу для имитации вашей фактической таблицы элементов и загружает ее с помощью 8 рядов данных. Я объявляю некоторые параметры, которые вам, скорее всего, не понадобятся, так как библиотека ado.net сделает для вас какую-то магию.

На основании значений, представленных для первых 3 параметров, вы получите эквивалентное соответствие строке в таблице и обновите значение имени файла. В моем примере вы увидите, что вся строка NULL будет иметь имя файла изменено с f07.bar на f07.bar.updated.

Оператор печати не требуется, но я помещаю его туда, чтобы вы могли видеть запрос, который был создан как помощь в понимании шаблона.

IF NOT EXISTS (SELECT * FROM tempdb.sys.tables T WHERE T.name like '%#item%') 
BEGIN 
    CREATE TABLE 
     #item 
    (
     itemid int identity(1,1) NOT NULL PRIMARY KEY 
    , itemCode varchar(10) NULL 
    , itemCheckDigit varchar(10) NULL 
    , itemSuffx varchar(10) NULL 
    , itemImageFileName varchar(50) 
    ) 
    INSERT INTO 
     #item 
    -- 2008+ 
    --table value constructor (VALUES allows for anonymous table declaration) {2008} 
    --http://technet.microsoft.com/en-us/library/dd776382.aspx 
    VALUES 
     ('abc', 'X', 'cba', 'f00.bar') 
    , ('ac', NULL, 'ca', 'f01.bar') 
    , ('ab', 'x', NULL, 'f02.bar') 
    , ('a', NULL, NULL, 'f03.bar') 

    , (NULL, 'X', 'cba', 'f04.bar') 
    , (NULL, NULL, 'ca', 'f05.bar') 
    , (NULL, 'x', NULL, 'f06.bar') 
    , (NULL, NULL, NULL, 'f07.bar') 
END 

SELECT * 
FROM #item I; 

-- These correspond to your parameters 
DECLARE 
    @itemCode5 varchar(10) 
, @itemCkDigit varchar(10) 
, @itemSuffx varchar(10) 
, @fileName varchar(50) 

-- Using the above table, populate these as 
-- you see fit to verify it's behaving as expected 
-- This example is for all NULLs 
SELECT 
    @itemCode5 = NULL 
, @itemCkDigit = NULL 
, @itemSuffx = NULL 
, @fileName = 'f07.bar.updated' 


DECLARE 
    @query nvarchar(max) 

SET 
    @query = N' 
UPDATE 
    I 
SET 
    itemImageFileName = @fileName 
FROM 
    #item I 
WHERE 
    1=1 
' ; 


IF @itemCode5 IS NOT NULL 
BEGIN 
    SET @query += ' AND I.itemCode = @itemCode5 ' + char(13) 
END 
ELSE 
BEGIN 
    -- These else clauses may not be neccessary depending on 
    -- what your data looks like and your intentions 
    SET @query += ' AND I.itemCode IS NULL ' + char(13) 
END 

IF @itemCkDigit IS NOT NULL 
BEGIN 
    SET @query += ' AND I.itemCheckDigit = @itemCkDigit ' + char(13) 
END 
ELSE 
BEGIN 
    SET @query += ' AND I.itemCheckDigit IS NULL ' + char(13) 
END 

IF @itemSuffx IS NOT NULL 
BEGIN 
    SET @query += ' AND I.itemSuffx = @itemSuffx ' + char(13) 
END 
ELSE 
BEGIN 
    SET @query += ' AND I.itemSuffx IS NULL ' + char(13) 
END 

PRINT @query 

EXECUTE sp_executeSQL @query 
, N'@itemCode5 varchar(10), @itemCkDigit varchar(10), @itemSuffx varchar(10), @fileName varchar(50)' 
, @itemCode5 = @itemCode5 
, @itemCkDigit = @itemCkDigit 
, @itemSuffx = @itemSuffx 
, @fileName = @fileName; 

-- observe that all null row is now displaying 
-- f07.bar.updated instead of f07.bar 
SELECT * 
FROM #item I; 

Перед

itemid itemCode itemCheckDigit itemSuffx itemImageFileName 
1  abc  X    cba   f00.bar 
2  ac   NULL    ca   f01.bar 
3  ab   x    NULL   f02.bar 
4  a   NULL    NULL   f03.bar 
5  NULL  X    cba   f04.bar 
6  NULL  NULL    ca   f05.bar 
7  NULL  x    NULL   f06.bar 
8  NULL  NULL    NULL   f07.bar 

после

itemid itemCode itemCheckDigit itemSuffx itemImageFileName 
1  abc  X    cba   f00.bar 
2  ac   NULL    ca   f01.bar 
3  ab   x    NULL   f02.bar 
4  a   NULL    NULL   f03.bar 
5  NULL  X    cba   f04.bar 
6  NULL  NULL    ca   f05.bar 
7  NULL  x    NULL   f06.bar 
8  NULL  NULL    NULL   f07.bar.updated 
+0

Спасибо billinkc, но он все еще не работает. FYI, это все строковые поля. – htm11h

+0

Я убрал пункт itemCheckDigit и itemSuf fix, и мои три записи обновлены. UPDATE: добавлено сравнение поля itemCheckDigit и снова обновлены все три записи. Мне нужно выяснить, как правильно оценить возможность NULL в поле itemSuffix. – htm11h

+0

Можете ли вы рассказать мне, что такое синтаксис для проверки нулевого значения поля? Кажется, что здесь происходит сбой кода. – htm11h

Смежные вопросы