TSQL:在一个字符串明确指定NVARCHAR什么好处?(TSQL: Any benefits fo

2019-10-18 05:20发布

当您添加通过一项新的job_typesys.sp_cdc_add_job @job_type
(这是类型nvarchar(20)

你可以作为传递参数

  • N'清理”
  • 清理

是否有任何理由或利益来使用通过前语法N'来传递参数给存储过程?

Answer 1:

只有当字符串包含Unicode字符

该字符串被转换implictly当传递到存储过程为nvarchar。

然而,SP执行之前,这是一个字面的varchar(“字符串常量”)不具有N-前缀。 所以,如果你是日本人的名字,你需要“N”,使之成为“Unicode常量”。 请参阅“ 常量在BOL”,它详细解释了,呃,常数...

编辑:由Andomar灵感的这个测试...

CREATE PROCEDURE dbo.ZanziBar
   @KungFoo nvarchar(1)
AS
SET NOCOUNT ON
SELECT @KungFoo
GO

EXEC dbo.ZanziBar '₠'

EXEC dbo.ZanziBar N'₠'


Answer 2:

在Windows中的大多数字符串都是unicode的UCS-16。 现在,我没有写SSMS,但我知道使用TDS协议SSMS会谈到SQL Server。 所以,期待合乎逻辑的做法是,SSMS转换''字符串8位TDS串,而它可以发送N''的字符串作为UCS-16 TDS字符串无需转换。 让我们来看看在测试中发生了什么:

select '₠', N'₠'
---- ----
?    ₠

(1 row(s) affected)    

? 是什么留下的仅Unicode字符,它迷路了在UCS-16至8位转换。

由于SSMS不知道存储过程期待什么类型的字符串,我希望它转换成一个''串在一个存储过程调用以及。

性能损失是可以忽略的,UCS-16到UCS-8和背部是非常快的。



文章来源: TSQL: Any benefits for explicitly specifying NVARCHAR in a string?