为什么sp_executesql需要ntext / nchar / nvarchar参数和语句而不是text / char / varchar?
我理解如何解决此问题(通过将所有语句/参数声明为nvarchar),但为什么Microsoft会强制执行此操作?有什么好处?
答案 0 :(得分:1)
我不确定是否因特定于该程序的任何特定原因而强制执行此操作。另一个对数据类型挑剔的系统存储过程的例子是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注入机会。 An example of that is in my answer here.