小编bee*_*eks的帖子

“CONCAT”不是可识别的内置函数名称

一位客户报告说他们在 SQL Server 2012 上运行,我们在最终交付之前交付了一些测试查询以进行测试,但是:

“CONCAT”不是可识别的内置函数名称。

我知道这CONCAT()是 SQL Server 2012 中引入的一个新的内置函数,这一切都很好,但是我被要求回滚我的更改以使这个 2008R2 兼容,打着“执行查询的用户可能不具有要执行的 Transact-SQL 权限。” 所以我只是证明我的观点,客户端很可能在 DEV 中安装的 SQL Server 版本与在 PROD 中安装的版本不同。

我找不到任何关于专门拒绝SELECT/EXECUTE内置标量值函数的权限的信息,但是否有可能,如果是这样,用户是否仍会收到相同的错误文本?

sql-server-2008 sql-server sql-server-2012 concat

34
推荐指数
2
解决办法
12万
查看次数

SQL Server - 在嵌套的非确定性视图堆栈中处理字符串的本地化

在分析数据库时,我遇到了一个视图,该视图引用了一些非确定性函数,对于此应用程序池中的每个连接,这些函数每分钟被访问1000-2500 次。一个简单的视图产生以下执行计划:SELECT

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

对于少于一千行且每隔几个月可能会看到一两行更改的视图来说,这似乎是一个复杂的计划。但以下其他注意事项会变得更糟:

  1. 嵌套视图是不确定的,所以我们不能索引它们
  2. 每个视图引用多个 UDFs 来构建字符串
  3. 每个 UDF 包含嵌套 UDFs 以获取本地化语言的 ISO 代码
  4. 堆栈中的视图使用s返回的附加字符串构建器UDF作为JOIN谓词
  5. 每个视图堆被视为一个表,这意味着有INSERT/ UPDATE/DELETE在每个触发器来写入底层表
  6. 在视图上,这些触发器使用CURSORSEXEC存储过程作为参考更多的这些串建设UDF秒。

这对我来说似乎很糟糕,但我只有几年的 TSQL 经验。也越来越好!

看来开发人员认为这是一个好主意,这样做是为了让存储的几百个字符串可以根据从UDF特定于模式的a 返回的字符串进行翻译。

这是堆栈中的一个视图,但它们都同样糟糕:

CREATE VIEW [UserWKStringI18N]
AS
SELECT b.WKType, b.WKIndex
    , CASE
       WHEN ISNULL(il.I18NID, N'') = N''
       THEN id.I18NString
       ELSE il.I18nString
       END AS WKString
    ,CASE
       WHEN ISNULL(il.I18NID, N'') …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2008-r2 view functions query-performance

20
推荐指数
1
解决办法
1037
查看次数

Anti-Semi Join 错误的解决方法

我构建了以下 SQL Server 查询,但它遇到了SQL Server 2005 中的反半连接缺陷,导致基数估计不准确(1 - 呃!)并永远运行。由于它是一个长期的生产 SQL Server,我不能轻易建议升级版本,因此我不能在这个特定查询上强制使用 traceflag 4199 提示。

我很难重构WHERE AND NOT IN (SELECT). 有人可以帮忙吗?我确保尝试使用基于集群密钥对的最佳连接。

SELECT TOP 5000 d.doc2_id
    ,d.direction_cd
    ,a.address_type_cd
    ,d.external_identification
    ,s.hash_value
    ,d.publishdate
    ,d.sender_address_id AS [D2 Sender_Address_id]
    ,a.address_id AS [A Address_ID]
    ,d.message_size
    ,d.subject
    ,emi.employee_id
FROM assentor.emcsdbuser.doc2 d(NOLOCK)
INNER JOIN assentor.emcsdbuser.employee_msg_index emi(NOLOCK)
    ON d.processdate = emi.processdate
    AND d.doc2_id = emi.doc2_id
INNER LOOP JOIN assentor.emcsdbuser.doc2_address a(NOLOCK)
    ON emi.doc2_id = a.doc2_id
    AND emi.address_type_cd = a.address_type_cd
    AND emi.address_id = a.address_id
INNER JOIN sis.dbo.sis s(NOLOCK) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server optimization

7
推荐指数
2
解决办法
1454
查看次数

最经济高效的方式来翻阅排序不佳的表格?

我有一个包含三列的表:HashUID1、HashUID2、Address_Name(这是一个文本电子邮件地址,前两个哈希列是将事件参与者表链接到电子邮件地址的疯狂创建。它丑陋,几乎无法解决由我控制。专注于 address_name 索引)

它有 7800 万行。没有正确排序。无论如何,该索引被拆分到许多快速 LUN 上并执行非常快速的索引查找。

我需要创建一系列查询以一次仅提取 20,000 个“每页行”,但要避免冲突或欺骗。由于没有标识列或易于排序的列,是否有一种简单的方法可以全选并翻页?

我说的是否正确,如果我将 select * from hugetablewithemails 放入临时表,然后通过 row_number 通过它选择该表在事务期间保留在内存中,对我来说,这是过多的内存资源? 这似乎是首选的分页方法。我宁愿按统计百分比分页。:(

有一个索引按顺序维护 address_name 电子邮件地址,并且维护得很好。在过去的一周里,我一直想通过花费一些时间来研究构建一个基于统计的窗口函数吐出范围的过程(我不擅长,但这个查询真的让我感兴趣)来帮助其他开发人员提供索引的一系列字符 1 到(变量)LEFT LIKE 字符,满足 20,000 行——但我什至没有时间开始查询......

几个问题:

  1. 有什么建议?不是在寻找实际的代码,只是一些基于经验的提示或建议,也许是警告。我想避免在初始扫描后进行额外的索引扫描。

  2. 这是正确的方法吗?

  3. 我正在考虑打破所有电子邮件地址的索引总和,收集行数(*),/20,000,并将其用作窗口函数,根据总行数的百分比对最小/最大子字符串(1,5)值进行分组建立分组范围。想法?

这是针对无法修改源数据库的 ETL 过程。

我希望通过一次完整的索引扫描,我可以做到:

  • 查询以根据索引使用情况(按字母顺序排序)获取直方图,并使用 min/max 将其分解(窗口化)以创建这样的一些范围,以便轻松查找所需的索引:

  • A-> AAAX,(例如 20k 行)AAA-Z,B->(另外 20k),B->BAAR -> BAAR-> CDEFG -> CDEFH > FAAH,等等。

我们为这个 ETL 过程在这些数据库中运行读提交。我们只尝试将它批量处理成 20k 行,因为 DBA 说我们通过抓取完整的表格使用了太多的网络资源。如果数据发生了变化(这是一个问题),我们会即时更新我们的 DW 和临时表。

喜欢用临时表,但如果我这样做,我会溢出到tempdb中,并获得关于其从DBA的圈套通过电子邮件和数据库太大。

sql-server paging

7
推荐指数
1
解决办法
442
查看次数

拆分一副牌,并像洗牌一样返回结果

假设我有一张桌子,上面有一副牌,编号为 01-52。我可以返回顶部和底部的卡片,就好像我通过执行以下操作将联合选择查询的每一侧握在我的左手和右手上:

select top 26 * from DeckOfCards order by CardNumber desc
union all
select top 26 * from DeckOfCards order by CardNumber asc
Run Code Online (Sandbox Code Playgroud)

这将是平分秋色。

但是我怎么能让 SQL Server 将返回的结果交织在一起,就好像我已经拿走了那个联合的两个部分,一个在我的左手,另一个在我的右手,然后像一副纸牌一样洗牌一次?

IE:CardNumber 52,后跟 1,顺序如下:52, 1, 51, 2, 50, 3, 49, 4, etc...

这不是一个家庭作业问题,只是当我试图闭上眼睛时脑海中闪过的那些事情之一。:)

sql-server t-sql

5
推荐指数
2
解决办法
664
查看次数