子串中的SQL Server更新

时间:2012-07-23 14:11:30

标签: sql-server

我在数据库中有一个varbinary列。它包含十六进制数据的长数据。

我使用substring来选择和显示数据。

SELECT TOP 100
    CHAR_KEY AS charid,
    USER_KEY AS userid,
    CONVERT(VARCHAR,substring(char_data, 9, 16)) AS name,
    CONVERT(INT,cast(reverse(substring(char_data, 7, 2)) as BINARY(2))) AS level,
    CONVERT(INT,substring(char_data, 25, 1)) AS type,
    CONVERT(INT, substring(char_data, 261, 1)) AS permission,
    guild_data.guild_name
FROM CHAR_DATA0
    inner join guild_data 
    on guild_key = 
        CONVERT(INT, 
                cast(reverse(substring(char_data, 33, 4)) as BINARY(4)))
WHERE CONVERT(INT, substring(char_data, 261, 1))=0x00 
ORDER BY level DESC

现在我想UPDATE,有什么想法吗?非常感谢。我是新来的。我试图寻找substring更新,但没有在网上找到任何有效的例子。

感谢。

- - - - - - - - 编辑

我试过了:

UPDATE
CHAR_TDATA0
SET char_data = stuff(cast(char_data as BINARY(2000)), 9, 16, CONVERT(BINARY(16), 'testnamezs'))
WHERE CHAR_KEY=4

但没有运气。得到了一些语法错误。

2 个答案:

答案 0 :(得分:0)

我无法理解为什么要以这种方式保存数据,而不是在数据库中为各种数据使用单独的列。

无论如何,我认为你不能以这种方式更新部分数据。我认为你要做的是选择一行的所有数据,更新你想要更改的部分,然后重新插入更新的基于十六进制的数据字符串作为一个整体。

类似的东西:

UPDATE
CHAR_TDATA0
SET char_data = "your already hex-encoded string of data here..."
WHERE CHAR_KEY=4

答案 1 :(得分:0)

首先尝试保存SQL Server变量中的内容,然后计算然后更新 希望这会有所帮助。

DECLARE @lc_char_data as varchar(max)
SET @lc_char_data = stuff(cast(char_data as BINARY(2000)), 9, 16, CONVERT(BINARY(16), 'testnamezs'))
UPDATE
CHAR_TDATA0
SET char_data = @lc_char_data
WHERE CHAR_KEY=4