【问题标题】:The data types varchar and varbinary are incompatible in the add operator数据类型 varchar 和 varbinary 在 add 运算符中不兼容
【发布时间】:2020-06-24 14:30:01
【问题描述】:

我需要根据 sid 查询 sys.database_principals,但我遇到了异常

The data types varchar and varbinary are incompatible in the add operator.
DECLARE @applicationusername VARCHAR(60)
DECLARE @applicationsid varbinary(85)
Declare @q  varchar(max)
SET @applicationusername = 'test123'
SET @applicationsid = 0x........    -- some valid varbinary

set @q = 'SELECT 1 FROM sys.database_principals WHERE name =''' + @applicationusername +''' AND [sid] = '+@applicationsid +' '
Print @q

EXEC (@q)

【问题讨论】:

  • 您可能需要先将您的 varbinary 转换或转换为 varchar。

标签: sql-server azure-sql-database


【解决方案1】:

这里不需要动态 SQL。只需将变量插入静态 SQL。

DECLARE @applicationusername VARCHAR(60)
DECLARE @applicationsid varbinary(85)
Declare @q nvarchar(max)
SET @applicationusername = 'test123'
SET @applicationsid = 0xa2827e2f0    -- some valid varbinary


SELECT 1 FROM sys.database_principals 
WHERE name = @applicationusername 
AND [sid] = @applicationsid 

即使使用动态 SQL,仍然使用参数,而不是将变量粘贴到 SQL 字符串中。

DECLARE @applicationusername VARCHAR(60)
DECLARE @applicationsid varbinary(85)
Declare @q nvarchar(max)
SET @applicationusername = 'test123'
SET @applicationsid = 0xa2827e2f0    -- some valid varbinary

set @q = N'
  SELECT 1 FROM sys.database_principals 
  WHERE name = @applicationusername 
    AND [sid] = @applicationsid'

Print @q

exec sp_executesql @q, 
     N'@applicationusername varchar(50), @applicationsid varbinary(85)', 
     @applicationusername =@applicationusername , 
     @applicationsid = @applicationsid

如果您确实需要将 varbinary 值转换为 TSQL 文字,您可以使用 convert 来完成,例如

select convert(varchar(200), @applicationsid, 1)

输出

0x0A2827E2F0

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2020-11-14
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多