动态设置会话的语言

Set language for the session dynamically

提问人:Nace Kapus 提问时间:7/19/2023 最后编辑:Dale KNace Kapus 更新时间:7/20/2023 访问量:56

问:

我在存储过程中参数化语言变量时遇到问题。我正在编写一个创建日期维度表的过程,并希望有一个“语言”参数。

根据文档,这应该可以通过创建一个 类型的变量来实现。sysname

但是,执行以下代码会导致错误:

DECLARE @Language sysname;
SET @Language = 'Spanish';
SET LANGUAGE @Language;

第 1 行、第 20 列处的解析错误:“N'Spanish”附近的语法不正确。

我注意到我可以使用动态 SQL 执行命令,尽管这实际上并没有改变语言,这似乎很奇怪。

例如:

SET LANGUAGE English

EXEC('SET LANGUAGE Spanish') -- this doesn't work
SELECT DATENAME(MONTH, GETDATE()) AS MonthName

SET LANGUAGE Spanish -- this works
SELECT DATENAME(MONTH, GETDATE()) AS MonthName

返回:

月名
七月
月名
胡里奥

有什么想法吗?

sql-server t-sql azure-synapse parse-error

评论

0赞 Panagiotis Kanavos 7/19/2023
为什么首先要在数据库中生成本地化字符串?这就是问题开始的地方。您不会通过对区域设置和语言进行硬编码来解决它。将日期格式化为字符串是客户端报表引擎的工作,而不是数据库的工作
0赞 Panagiotis Kanavos 7/19/2023
create date dimension table在维度表本身中创建并存储所需的字符串。这是这张表存在的最重要原因之一。不仅允许更轻松地进行聚合,而且还为项目提供报告标签。这是一般维度的常见指南。数据库服务器生成的标签与企业使用的标签不同。尤其是财政期间。通常有多组标签列,每种目标语言一组。页/列存储压缩消除了存储成本提高了 IO 性能
1赞 Panagiotis Kanavos 7/19/2023
在维度创建脚本中,可以将 T-SQL 与区域性参数一起使用,为所需的所有语言生成所需的本地化字符串。 速度很慢,但维度脚本只需运行一次。不过,不要尝试在报告查询中使用,因为您将付出性能损失FORMATFORMATFORMAT
1赞 siggemannen 7/19/2023
动态 sql 有自己的作用域,所以如果你想让你的语言“坚持下去”,你还必须在动态 sql 字符串中添加其余代码。话虽如此,@PanagiotisKanavos说的话:D
1赞 Panagiotis Kanavos 7/19/2023
如果我没记错的话,SSAS或SSIS日期维度向导甚至提供了添加多种语言的标签的功能

答: 暂无答案