0

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

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

4

2 回答 2

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
于 2013-11-15T11:29:40.653 回答
0

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

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

就像是:

UPDATE
CHAR_TDATA0
SET char_data = "your already hex-encoded string of data here..."
WHERE CHAR_KEY=4
于 2012-07-23T14:43:58.170 回答