为什么我们不应该在“sp_executesql”中使用varchar?

时间:2016-04-04 09:59:16

标签: sql sql-server sql-server-2008

每当我尝试在varchar中使用sp_executesql时,它总会抛出以下错误:

  

过程需要参数'@statement'的类型   'NTEXT / NCHAR / nvarchar的'

我们应该使用nvarchar吗?

如果“exec”允许我们使用varchar,为什么不使用sp_executesql?

示例代码:

DECLARE @IntVariable int;
DECLARE @SQLString **varchar**(500);--**we need to use nvarchar!! but why?**

DECLARE @ParmDefinition nvarchar(500);


SET @SQLString =
     'SELECT nationalidnumber, NationalIDNumber, Title, LoginID
       FROM AdventureWorks.HumanResources.Employee 
       WHERE nationalidnumber = @BusinessEntityID';
SET @ParmDefinition = '@BusinessEntityID int';

SET @IntVariable = 14417807;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;

SET @IntVariable = 109;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @BusinessEntityID = @IntVariable;

1 个答案:

答案 0 :(得分:0)

Msdn0

  

执行

     

在a中执行命令字符串或字符串   Transact-SQL批处理

     

<强> @string_variable

     

是局部变量的名称。 @string_variable可以是任何 char varchar nchar nvarchar 数据类型。这些包括(最大)数据

     

<强>类型。 [N]'tsql_string'

     

是一个常量字符串。 tsql_string可以是任何 nvarchar varchar 数据类型。如果包含N,则将字符串解释为nvarchar   数据类型。

Msdn1

  

sp_executesql

     

[@stmt =]声明

     

是包含Transact-SQL语句或批处理

的Unicode字符串

因此它需要设计中的变量(如@marc_s所说)。正如@MattGibson评论的那样,使用Unicode是一种现代的做法。

Msdn2

  

nvarchar [(n | max)]

     

可变长度 Unicode 字符串数据。

Msdn3

  

varchar [(n | max)]

     

可变长度,非Unicode 字符串数据。

在这里,您可以详细了解varcharnvarchar之间的区别: What is the difference between varchar and nvarchar?

相关问题