为什么 sp_executesql 需要 ntext/nchar/nvarchar 参数和语句而不是 text/char/varchar?
我了解如何解决此问题(通过将所有语句/参数声明为 nvarchar),但为什么 Microsoft 会强制执行此操作?有什么好处?
为什么 sp_executesql 需要 ntext/nchar/nvarchar 参数和语句而不是 text/char/varchar?
我了解如何解决此问题(通过将所有语句/参数声明为 nvarchar),但为什么 Microsoft 会强制执行此操作?有什么好处?
我不确定这是出于特定于该程序的任何特定原因而强制执行的。另一个对数据类型很挑剔的系统存储过程的例子是sp_trace_create.
这不仅需要nvarchar
参数@tracefile
,而且参数@maxfilesize
必须作为“bigint”传递,并且它不接受始终能够正确转换的文字整数。
这失败了
DECLARE @TraceID int
EXEC sp_trace_create @TraceID OUTPUT, 0, N'X:\Foo', 1, NULL
这成功了
DECLARE @TraceID int
DECLARE @x bigint = 1
EXEC sp_trace_create @TraceID OUTPUT, 0, N'X:\Foo', @x, NULL
这两者都在master
数据库中显示为系统扩展存储过程。我假设这些扩展存储过程的调用机制与常规存储过程的调用机制不同,因此 SQL Server 不会隐式转换参数。
不过,像这样sp_executesql
强制执行并不一定是坏事。nvarchar
动态 SQL 可能出现的一个潜在问题是,如果提供的字符串是经过nvarchar
消毒然后强制varchar
转换的,则可能会打开 SQL 注入机会。我在这里的回答就是一个例子。