dan*_*die 1 sql t-sql sql-server stored-procedures nvarchar
当你添加传递一个新job_type的sys.sp_cdc_add_job @job_type,
(这是类型nvarchar(20))
您可以将参数传递为
N'清理'使用前一种语法N'将参数传递给存储过程是否有任何理由或好处?
仅当字符串包含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)
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并且返回非常快.