sql server ,默认为所有查询设置N前缀为unicode

Ham*_*mid 6 sql-server query c#

ms sql server 中是否有任何选项为我的数据库使用 N 前缀。我的应用程序中有很多查询,其中没有一个对 nvarchar 字段使用 N 前缀,现在我必须为所有这些查询设置 N,这需要很长时间。我的校对是 Persian_100,它需要 unicode(N 前缀)所以任何建议表示赞赏

select * from table1 where field1=N'????' ;
Run Code Online (Sandbox Code Playgroud)

我想在我的查询中跳过 N 前缀,但它充当所有类型查询的 unicode:

Jon*_*gel 4

不,没有办法做到这一点。

任何执行您想要的操作的选项都会非常令人困惑,因为需要有一种方法在字符串文字语法中将其关闭。选择数据类型时还需要注意其他注意事项(例如存储大小),因此使用这样的设置可能非常危险。


对于将参数化 T-SQL 语句发送到 SQL Server 的 .NET 应用程序,该框架会为您处理此问题,因为 .NETString本质上支持 Unicode,并且事物是使用该假设构建的。如果 ORM 类型的库编程得当的话,这也适用于它们。

考虑以下代码片段:

IDbCommand cmd = connection.CreateCommand();
cmd.CommandText = @"SELECT * FROM sys.server_principals WHERE name = @name";

IDbDataParameter param = cmd.CreateParameter();
param.DbType = DbType.String;
param.ParameterName = "@name";
param.Value = "dbo";
cmd.Parameters.Add(param);

IDataReader dr = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

实际发送到 SQL Server 的内容是这样的(为了清楚起见,添加了换行符):

exec sp_executesql N'SELECT * FROM sys.server_principals WHERE name = @name',
    N'@name nvarchar(3)',@name=N'dbo'
Run Code Online (Sandbox Code Playgroud)

您可以看到框架自动使用 Unicode 类型作为参数(3 的长度完全是一个单独的讨论......)。

需要修改代码的地方是 SQL 查询未参数化(或不可参数化,即 DDL)的情况——换句话说,查询的参数直接连接到字符串中,或​​包含字符串常量。有关如何在使用动态 SQL 时避免 SQL 注入问题的示例,请参阅我的回答。

  • +1但值得指出的是,.Net 支持字符串的方式有一个阴暗面,即当“WHERE varchar = @value”与“Parameters.AddWithValue”天真地使用时强制进行表扫描。请参阅[数据访问代码如何影响数据库性能](http://msdn.microsoft.com/en-us/magazine/ee236412.aspx) (3认同)