代码之家  ›  专栏  ›  技术社区  ›  dance2die

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

  •  1
  • dance2die  · 技术社区  · 16 年前

    当你添加一个新的密码时 job_type sys.sp_cdc_add_job @job_type
    (这是一种 nvarchar(20) )

    您可以通过以下两种方式传递参数:

    • N' 清理'

    使用前一种语法有什么原因或好处 将参数传递给存储过程?

    2 回复  |  直到 16 年前
        1
  •  5
  •   gbn    16 年前

    仅当字符串包含unicode字符时

    当字符串被传递到存储的进程中时,该字符串被隐式转换为nvarchar。

    但是,在执行SP之前,它是一个没有N前缀的文本varchar(“字符串常量”)。因此,如果您要输入日文名称,则需要使用“N”使其成为“unicode常量”。见“ constants

    编辑:这一测试的灵感来自安德奥马尔。。。

    CREATE PROCEDURE dbo.ZanziBar
       @KungFoo nvarchar(1)
    AS
    SET NOCOUNT ON
    SELECT @KungFoo
    GO
    
    EXEC dbo.ZanziBar '₠'
    
    EXEC dbo.ZanziBar N'₠'
    
        2
  •  5
  •   Andomar    16 年前

    Windows中的大多数字符串都是unicode UCS-16。现在我没有编写SSMS,但我知道SSMS使用TDS协议与SQL Server通信。因此,合乎逻辑的预期是SSMS转换 '' N'' 字符串作为UCS-16 TDS字符串,无需转换。让我们看看测试中会发生什么:

    select '₠', N'₠'
    ---- ----
    ?    ₠
    
    (1 row(s) affected)    
    

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

    '' 存储过程调用中的字符串。

    推荐文章