【问题标题】:Collation issue in UNION QueryUNION Query 中的排序规则问题
【发布时间】:2018-07-04 21:20:47
【问题描述】:

我正在从事一个项目,我的任务是创建一系列联合查询来编译来自不同数据库的具有相同结构的数据。其中一些查询非常广泛,包含大量列。不,我无法更改列数。当我尝试创建查询时,它给出了排序规则错误。我可以通过添加到列中的这个命令轻松解决这个问题:

整理数据库_DEFAULT

现在,问题是我必须使用 UNION 对 5 或 6 个不同的数据库和 200 多列进行 50 多个查询。每次我将该命令添加到列时,我还必须为列添加别名,否则我会丢失名称。如果有更有效的方法可以做到这一点,而不必将 COLLATE 子句添加到每一列,有什么想法吗?

【问题讨论】:

  • SQL 方面我对您没有什么好的建议,但是要自动将排序规则和别名添加到您的列中,您可以使用正则表达式。列出您的列(每列在单独的行上)并执行正则表达式查找和替换:^(.*)$\1 COLLATE DATABASE_DEFAULT AS \1。请注意,\1 是反向引用,您的文本编辑器可能会使用 $1
  • 如何用COLLATE DATABASE_DEFAULT创建一个VIEW

标签: sql sql-server collation


【解决方案1】:

您可以利用 SSMS 列编辑模式。以下是它的工作原理。

  1. 将您要选择的每个表格列放在单独的一行,然后对齐点。
  2. 在第一个 SELECT 行中,键入空格,直到我将“光标”(管道符号)放在下面的位置,以便该行成为所有列名称行中最长的行:
SELECT P .AB    |
     , QR.CDEFG
     , S .HIJK
FROM P
JOIN QR ON ...
-- etc
  1. 将光标放在该位置,按 ALT-Shift-down 直到到达 SELECT 行的最后一行,这将为您提供一个高多行光标
SELECT P .AB    |
     , QR.CDEFG |
     , S .HIJK  |
FROM P
JOIN QR ON ...
  1. 现在输入(或粘贴)COLLATE DATABASE_DEFAULT AS,此文本将同时出现在所有行中:
SELECT P .AB    COLLATE DATABASE_DEFAULT AS |
     , QR.CDEFG COLLATE DATABASE_DEFAULT AS |
     , S .HIJK  COLLATE DATABASE_DEFAULT AS |
FROM P
JOIN QR ON ...
  1. 现在,使用 Alt-Shift-right/down 或使用 Alt 精确选择下面显示的文本kbd> 同时拖动鼠标:
AB   
CDEFG
HIJK 
  1. 使用复制然后粘贴第一行末尾的文本块,结果如下:
SELECT P .AB    COLLATE DATABASE_DEFAULT AS AB   
     , QR.CDEFG COLLATE DATABASE_DEFAULT AS CDEFG
     , S .HIJK  COLLATE DATABASE_DEFAULT AS HIJK 
FROM P
JOIN QR ON ...

有关这方面的更多信息,请参阅例如https://blog.sqlauthority.com/2016/06/06/sql-server-vertical-select-mode-feature-sql-server-management-studio/

【讨论】:

  • 哇,很酷的东西。感谢你的分享!我猜是隐藏的宝藏!
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多