如何用C#将动态查询插入SQL Server表?WHERE子句报错求助
解决SQL Server插入含单引号的动态查询语句报错问题
首先看你的示例SQL语句,问题出在动态查询字符串里的单引号没有正确转义。SQL Server中,当你要在字符串里表示一个单引号时,需要用两个连续的单引号来转义,否则数据库会把中间的单引号当成字符串结束的标记,直接导致语法解析错误。
你的原语句里:
INSERT INTO [dbo].[tablename] ([DataQuery],[DataQueryName],[EditedDate],[LastUsedDate],[UserId]) VALUES ('SELECT * from tablename WHERE tablename.UID < '10' AND tablename.status = 'Active' ORDER BY Id' ,'aa',GETDATE(),GETDATE(),'1541')
这里'10'和'Active'里的单引号会和外层包裹整个SELECT语句的单引号冲突——数据库解析到WHERE tablename.UID < '的时候就以为字符串结束了,后面的内容自然变成了无效语法。
解决方案1:手动转义单引号
把动态查询里的每个单引号替换成两个连续的单引号,修改后的语句如下:
INSERT INTO [dbo].[tablename] ([DataQuery],[DataQueryName],[EditedDate],[LastUsedDate],[UserId]) VALUES ('SELECT * from tablename WHERE tablename.UID < ''10'' AND tablename.status = ''Active'' ORDER BY Id' ,'aa',GETDATE(),GETDATE(),'1541')
这样数据库就能正确识别字符串内部的单引号,不会再出现语法报错。
解决方案2:使用参数化查询(更推荐)
如果是在应用程序中执行这条插入语句,强烈建议用参数化查询。这种方式不仅能彻底避免单引号转义的麻烦,还能有效防止SQL注入攻击,安全性更高。比如在C#中可以这样实现:
string insertSql = "INSERT INTO [dbo].[tablename] ([DataQuery],[DataQueryName],[EditedDate],[LastUsedDate],[UserId]) VALUES (@DataQuery, @DataQueryName, GETDATE(), GETDATE(), @UserId)"; using (SqlConnection conn = new SqlConnection(yourConnectionString)) { SqlCommand cmd = new SqlCommand(insertSql, conn); cmd.Parameters.AddWithValue("@DataQuery", "SELECT * from tablename WHERE tablename.UID < '10' AND tablename.status = 'Active' ORDER BY Id"); cmd.Parameters.AddWithValue("@DataQueryName", "aa"); cmd.Parameters.AddWithValue("@UserId", "1541"); conn.Open(); cmd.ExecuteNonQuery(); }
参数化查询会由数据库引擎自动处理字符串中的特殊字符,既省心又安全。
额外小提示
如果你的DataQuery字段是NVARCHAR类型(支持Unicode),在SSMS中直接执行时可以给字符串加上N'前缀,确保特殊字符(比如中文)能正确存储,当然核心的单引号转义还是不能少:
INSERT INTO [dbo].[tablename] ([DataQuery],[DataQueryName],[EditedDate],[LastUsedDate],[UserId]) VALUES (N'SELECT * from tablename WHERE tablename.UID < ''10'' AND tablename.status = ''Active'' ORDER BY Id' ,N'aa',GETDATE(),GETDATE(),N'1541')
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

