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

发布于 2024-08-10 04:36:54 字数 370 浏览 10 评论 0原文

当您将新的 job_type 添加到 时sys.sp_cdc_add_job @job_type
(类型为 nvarchar(20)

您可以将参数传递为

  • N'cleanup'
  • cleanup

使用以前的语法有什么理由或好处吗使用 N' 将参数传递给存储过程?

When you add pass a new job_type to sys.sp_cdc_add_job @job_type,
(which is of type nvarchar(20))

You can pass the argument as either

  • N'cleanup'
  • cleanup

Are there any reasons or benefits to use the former syntax using N' to pass the argument to stored procedures?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏日落 2024-08-17 04:36:54

仅当字符串包含 unicode 字符时,

字符串在传递到存储过程时才会隐式转换为 nvarchar。

然而,在 SP 执行之前,它是一个没有 N 前缀的文字 varchar(“字符串常量”)。因此,如果您使用日语名称,则需要“N”才能使其成为“unicode 常量”。请参阅 BOL 中的“常量”,其中解释了有关呃常量的更多信息...

编辑:受安多玛启发对此进行的测试...

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

EXEC dbo.ZanziBar '₠'

EXEC dbo.ZanziBar N'₠'

Only if the string contains unicode characters

The string is implictly converted to nvarchar when the passed into the stored proc.

However, before SP execution, it's a literal varchar ("character string constant") without N prefix. So, if you Japanese names, you'll need "N" to make it a "unicode constant". See "constants" in BOL which explains more about, er, constants...

Edit: A test of this inspired by Andomar...

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

EXEC dbo.ZanziBar '₠'

EXEC dbo.ZanziBar N'₠'
两相知 2024-08-17 04:36:54

Windows 中的大多数字符串都是 unicode UCS-16。现在我没有编写SSMS,但我知道SSMS 使用TDS 协议与SQL Server 进行对话。因此,合乎逻辑的是 SSMS 将 '' 字符串转换为 8 位 TDS 字符串,同时它可以将 N'' 字符串作为 UCS-16 TDS 字符串发送无需转换。让我们看看测试中会发生什么:

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

(1 row(s) affected)    

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

由于 SSMS 不知道存储过程需要什么类型的字符串,因此我希望它也能在存储过程调用中转换 '' 字符串。

性能损失应该可以忽略不计,UCS-16 到 UCS-8 的往返速度非常快。

Most strings in Windows are unicode UCS-16. Now I didn't write SSMS, but I know SSMS talks to SQL Server using the TDS protocol. So the logical thing to expect is that SSMS converts '' strings to an 8-bit TDS string, while it can send N'' strings as a UCS-16 TDS string without conversion. Let's see what happens in a test:

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

(1 row(s) affected)    

The ? is what's left of the Unicode-only character, it got lost in the UCS-16 to 8-bit translation.

Since SSMS does not know what type of string a stored procedure expects, I expect it to convert a '' string in a stored procedure call as well.

The performance penalty should be negligible, UCS-16 to UCS-8 and back is very fast.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文