不执行更新语句(update statement not executing)

2019-10-29 05:14发布

我试图写一个UPDATE查询可以检查中的一个字段为空值。 我有三个条件,二是强制性的,三个字段。 itemCode和itemCheckDigit会一直存在,itemSuffix是possibily空。

可能有多个记录,其中itemCode和itemCheckDigit在一起等于其他记录,itemSuffix是unquie标识,只会存在一个实例,虽然其中itemSuffix为null,并且它永远不会被复制。

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

这就是我想我会喜欢做的事,但它不工作。

Answer 1:

你的问题是,你是缠绕你的参数刻度标记在你的语句,因此当它评估它希望从项目表,其中itemCode是“玩具”(注意单引号)的东西

你在做字符串连接是怎么一会,不好,将参数添加到他们的动态查询。 相反,采取刻度线出来,像这样

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

为了处理可选搜索参数,本文由比尔·格拉齐亚诺是优秀: 在存储过程使用动态SQL 。 我觉得这是打击避免设置重新编译选项上,避免表扫描的查询重新编译之间的良好平衡。

请享受这个代码。 它创建一个临时表与8行的数据来模拟实际的项目表,并加载它。 我宣布一些相关参数,你最有可能惯于”需要做的ado.net库会做一些的那个魔法给你。

基于前3组的参数提供的值,你会得到一个相当于匹配在表中的行和将更新文件名值。 在我的例子,你会看到所有的空行并从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 statement not executing