Ваша проблема заключается в том, что вы оберточные засечки вокруг ваших параметров в вашем заявлении так, когда он оценил ее ищет вещи из таблицы элементов, где Артикул является «игрушкой» (обратите внимание на одинарные кавычки)
Строки конкатенация вы делаете то, как можно было бы плохо добавить параметры в свои динамические запросы. Вместо этого возьмите клещ выделяет как и
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
Очевидно что-то в вашей ИНЕКЕ является сдерживающим UPDATE. Временно преобразуйте его в SELECT и удалите предикаты из WHERE, пока не получите результаты. Тогда вы выделите проблему. –
Я думаю, что я определил часть вашей проблемы, но если вы хотите синхронизировать свое описание с предоставленным кодом (столбцы не совпадают), мы можем работать с вашими проблемами сравнения NULL. – billinkc
Попытка вашего предложения сейчас, у меня есть подозрение, что это имеет отношение к Null. Является ли это подходящим синтаксисом для проверки нулевого значения в поле? – htm11h