TSQL:在字符串中明确指定NVARCHAR有什么好处?

dan*_*die 1 sql t-sql sql-server stored-procedures nvarchar

当你添加传递一个新job_typesys.sp_cdc_add_job @job_type,
(这是类型nvarchar(20))

您可以将参数传递为

  • N'清理'
  • 清理

使用前一种语法N'将参数传递给存储过程是否有任何理由或好处?

gbn*_*gbn 5

仅当字符串包含unicode字符时

传入存储过程中时,字符串被隐式转换为nvarchar.

但是,在SP执行之前,它是没有N前缀的文字varchar("字符串常量").所以,如果你是日文名字,你需要"N"才能使它成为"unicode constant".请参阅BOL中的" 常量 ",它解释了更多关于,呃,常数......

编辑:这个受Andomar启发的测试......

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

EXEC dbo.ZanziBar '?'

EXEC dbo.ZanziBar N'?'
Run Code Online (Sandbox Code Playgroud)


And*_*mar 5

Windows中的大多数字符串都是unicode UCS-16.现在我没有写SSMS,但我知道SSMS使用TDS协议与SQL Server对话.所以理所当然的事情是SSMS将''字符串转换为8位TDS字符串,而它可以将N''字符串作为UCS-16 TDS字符串发送而不进行转换.让我们看看测试中会发生什么:

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

(1 row(s) affected)    
Run Code Online (Sandbox Code Playgroud)

?是Unicode唯一字符的剩余部分,它在UCS-16到8位转换中丢失了.

由于SSMS不知道存储过程所期望的字符串类型,我希望它也能''在存储过程调用中转换字符串.

性能损失应该可以忽略不计,UCS-16到UCS-8并且返回非常快.