当您添加通过一项新的job_type
来sys.sp_cdc_add_job @job_type
,
(这是类型nvarchar(20)
你可以作为传递参数
-
N'
清理” - 清理
是否有任何理由或利益来使用通过前语法N'
来传递参数给存储过程?
当您添加通过一项新的job_type
来sys.sp_cdc_add_job @job_type
,
(这是类型nvarchar(20)
你可以作为传递参数
N'
清理” 是否有任何理由或利益来使用通过前语法N'
来传递参数给存储过程?
只有当字符串包含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'₠'
在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和背部是非常快的。