我們有一個文本區域,用戶可以在其中寫入任何內容,它是一個動態視圖,稍后會加載。當用戶準備好保存它時,textarea 被發送以便保存在資料庫中。
問題是,有時有效,有時無效。它不起作用的時候是因為我們收到了:
'?' 附近的語法不正確。
我們用兩個單引號替換了所有單引號,并確保它正確到達資料庫。
ALTER STORED PROCEDURE dbo.SaveHtml @htmlValue NVARCHAR(MAX)
AS
DECLARE @SQL_QUERY NVARCHAR(MAX);
SET @SQL_QUERY = N'UPDATE TEMP_TABLE SET BLOCK_1 = N{VALUE} WHERE ID = 12';
SET @SQL_QUERY = REPLACE(@SQL_QUERY,'{VALUE}', ISNULL(@htmlValue,NULL));
EXECUTE (@SQL_QUERY);
基本上這就是它的作用,我們創建一個動態 SQL,因為有動態引數,但在這個例子中我省略了它。
它可以作業,但有時當用戶從 Word 復制和粘貼資料時,字串到達??時會帶有像 ???ê?????!?丕鼐? ?﹗£???ωω??????﹩f?@埐埐埐吽鍥鍥锝,后來我們收到了指示的錯誤。
甚至有時它會與這些字符(不一定是完全相同或相同順序的字符)一起到達并成功保存。
對于上面提到的例子,如果我洗掉第一個 黐 字符,則字串保存成功。
'<p style="margin-top:0cm;margin-right:0cm;margin-bottom:0cm;
margin-left:36.2pt;text-align:justify;text-indent:-18.0pt;line-height:normal;???ê?????!????? ?﹗£???ω??????﹩f?@? ? ?囌垐輈??靀ミ...'
當我除錯以查看動態 SQL 并列印它時,它看起來像:
UPDATE TEMP_TABLE SET BLOCK_1 = N'<div class="note-editable" contenteditable="true" role="textbox" aria-multiline="true" ...' WHERE ...
因為這些是我們保存的字串。
這是目前正在生產中,因為它有效,但它不起作用的時候是例外。當中文、阿拉伯文和更多特殊字符出現時,我們的代碼是否有效就成了一個樂章。
我怎么能解決這個問題?
uj5u.com熱心網友回復:
您沒有參考您的字串,也沒有將其視為NVARCHAR. 取而代之的是:
SET @SQL_QUERY = REPLACE(@SQL_QUERY,'{VALUE}', ISNULL(@htmlValue,NULL));
你需要這個語法正確的 SQL:
SET @SQL_QUERY = REPLACE(@SQL_QUERY,'{VALUE}', ISNULL('N''' @htmlValue '''','NULL'));
但是,正確且安全的方法是使用sp_executesql適當的引數,如下所示:
SET @SQL_QUERY = N'UPDATE #TEMP_TABLE SET BLOCK_1 = @VALUE WHERE ID = 12';
EXEC sp_executesql @SQL_QUERY, N'@VALUE nvarchar(max)', @HtmlValue;
注意:除錯動態 SQL 的方法是使用PRINT陳述句,如果您在原始 SQL 上運行該陳述句,則會給出:
UPDATE TEMP_TABLE SET
BLOCK_1 = ???ê?????!????? ?﹗£???ω??????﹩f?@? ? ?囌垐輈??靀ミ
WHERE ID = 12
這顯然是錯誤的,你需要:
UPDATE TEMP_TABLE SET
BLOCK_1 = N'???ê?????!????? ?﹗£???ω??????﹩f?@? ? ?囌垐輈??靀ミ'
WHERE ID = 12
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344041.html
標籤:C# 。网 sql-server 数据库 查询语句
