我的sql更新正常工作,但它更改了土耳其字符。更新查询将诸如ı之类的土耳其字符更改为i等。这是我的查询:
set @updstatement = 'UPDATE ' + @table_name + ' SET ' + @text_col + '= ''' + @newText + ''' WHERE ' + @id_col + '= ''' + @cur_Id + '''';
PRINT @updstatement
exec sp_executesql @updstatement
PRINT 'Updated: ' + @cur_Id;
我尝试了COLLATE DATABASE_DEFAULT
和COLLATE TURKISH_CI_AS
选项,但没有任何变化。列的数据类型为ntext。表数据库的整理设置为Latin1_General_CI_AS
。表的整理设置为Latin1_General_CI_AS
。列的整理设置为Latin1_General_CI_AS
。在更新之前,我可以看到土耳其字符已正确存储在表的列中。更新后,列的查询数据已损坏。你有什么主意吗?
答案 0 :(得分:1)
就像我在评论中说的那样,不要将原始值注入动态SQL语句中。这是一个很大的SQL注入问题,没有理由这样做。
我怀疑您使用的是varchar
,并且结合使用非参数化语句会导致此问题。如果这样做不能解决问题,则需要提供一个示例来复制问题(注意猜测的数据类型):
DECLARE @table_name sysname,
@textcol sysname,
@newtext nvarchar(50), --Guessed datatype
@id_col sysname,
@cur_id int; --Guessed dataytpe
DECLARE @updstatement nvarchar(MAX);
SET @updstatement = 'UPDATE ' + QUOTENAME(@table_name) + N' SET ' + QUOTENAME(@text_col) + N' = @newtext WHERE ' + QUOTENAME(@id_col) + N' = @cur_id;';
PRINT @updstatement; --Your debugging friend
EXEC sp_executesql @SQL, N'@newtext nvarchar(50), @cur_id int', @newtext = @newtext, @cur_id = @cur_id;