如何将变量从一种排序规则转换为另一种排序规则?

时间:2019-06-14 16:29:47

标签: sql sql-server

我有一个脚本可以在两个数据库之间切换:master和'B'。

数据库主数据库具有排序规则'SQL_Latin1_General_CP1_CI_AS'

数据库B具有排序规则'Latin1_General_CI_AS'

我已经尝试过使用COLLATE和CAST命令,但到目前为止仍无济于事。

USE B
DECLARE @ProductsUserName varchar(200)
SET @ProductsUserName = 'SomeValue'

USE master 
DECLARE @UserNameMaster varchar(200) = @ProductsUserName COLLATE SQL_Latin1_General_CP1_CI_AS
DECLARE @GrantViewServerStatement varchar(200) = 'GRANT VIEW SERVER STATE TO ' + @UserNameMaster

查询将在最后一行爆炸,并显示错误消息:

“无法执行从varchar值到varchar的隐式转换,因为由于添加操作符中的“ Latin1_General_CI_AS”和“ SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突而导致无法解决该值的排序规则。”

很显然,在具有不同排序规则的两个varchar之间使用'+'运算符存在某种问题。但是不确定如何将变量“投射”到新的排序规则中!

1 个答案:

答案 0 :(得分:0)

执行归类作为字符串连接的一部分。即:

USE B
DECLARE @ProductsUserName varchar(200)
SET @ProductsUserName = 'SomeValue'

USE master 
DECLARE @UserNameMaster varchar(200) = @ProductsUserName
DECLARE @GrantViewServerStatement varchar(200) = 'GRANT VIEW SERVER STATE TO ' + (@UserNameMaster COLLATE SQL_Latin1_General_CP1_CI_AS)