AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[sql-server-2005](dba)

Martin Hope
MrVimes
Asked: 2022-07-15 04:47:12 +0800 CST

SQL Server Swap 后,除了小型 ODBC 查询之外的任何东西都在长距离 VPN 上失败

  • 0

我最近交换了数据库服务器(将数据库从旧恢复到新然后交换 IP)......

旧:Sql Server 2005、Windows Server 2003 新:Sql Server 2008、Windows Server 2012

从地理位置附近的 VPN 连接到服务器(点网网站、PHP、vbscript、mssql)的所有进程在新服务器上都可以正常工作。

但是我们在服务器(英国)和卫星办公室(美国肯塔基州)之间有一个 VPN,还有一个在 Microsoft Access 上运行的数据库应用程序,当在新服务器上执行查询时,这个应用程序会抛出一个错误。错误是......

错误:ODBC--调用失败。

[Microsoft][ODBC SQL Server 驱动程序][DBNETLIB]ConnectionRead (recv())。(#10054) [Microsoft][ODBC SQL Server Driver][DBNETLIB]一般网络错误。检查您的网络文档。(#11)

如果我暂时让此应用程序查询旧服务器(通过更改本地主机文件),则不会发生错误并且一切正常。

为了帮助解决这个问题,我构建了一个小脚本......

'ConString="Provider=SQLOLEDB;Data Source=172.17.201.11,1433;" & _
'   "OLE DB Services=-2;Initial Catalog=Perf;Network=DBMSSOCN;User Id=*;Password=*"

ConString="Provider=SQLOLEDB;Data Source=172.17.201.11,1433;" & _
    "Initial Catalog=Perf;Network=DBMSSOCN;User Id=*;Password=*"
    set conn = CreateObject("ADODB.Connection") 
    
Conn.connectiontimeout=500
Conn.commandtimeout=500
conn.open ConString

SCRIPTTIMEOUT = 1000

'sqlstring="SELECT top 100 ClientID FROM Clients"
sqlstring="SELECT top 1000 ClientID FROM Clients"
'sqlstring="SELECT ClientID FROM Clients"

'succeeds with top 100
'fails with top 1000 or no limit


set Rcount = Conn.Execute(sqlstring)

msgbox Rcount(0)

Rcount.Close
set Rcount = Nothing

set sqlstring = Nothing
Conn.Close
set Conn = Nothing

如果我查询 100 行,则该脚本有效。如果我尝试 1000,它每次都会失败(我还没有尝试过中间数量,但我认为缩小范围没有多大意义)

如果我将 IP 地址切换到旧服务器,该脚本将起作用(其他一切都相同 - 相同的 vpn,相同的客户端,相同的脚本)

脚本和访问应用程序通过不同的 VPN(也英国)在各个方面都可以正常工作

  • 我浏览了每台服务器上可以找到的所有设置(在 MS SQL Studio、配置管理器、网络设置中),以尝试匹配并尝试不同的设置。
  • 我已停止并启动服务
  • 我已经用谷歌搜索了这个并尝试了我能找到的每一个建议(我已经迷失了方向,但我已经尝试添加OLE DB Services=-2。我已经尝试过Encrypt=on(并且关闭)。我已经尝试过Trusted_connection=on(并且关闭)。我已经尝试过Pooling=on(并且关闭)。我有尝试在 IP 之后指定实例名称。

两台服务器都在同一个物理机架中,在同一个网络/子网上,连接到同一个物理交换机。

在我走上弄乱VPN设置的路线之前,交换电线(需要访问DC)我可以/应该做/看看新服务器上的帮助吗?

编辑: 如果我添加Packet Size=1024;到我的连接字符串,它就可以工作!问题是,两台服务器都默认设置为 4096,而旧服务器可以正常工作。

编辑 2以上适用于我的测试脚本,但不适用于访问应用程序。

我希望找到一种不需要更改连接字符串的解决方法,因为这会很麻烦(涉及访问应用程序的开发人员)

sql-server-2008 sql-server-2005
  • 1 个回答
  • 88 Views
Martin Hope
Kristina Kristina
Asked: 2020-02-18 06:38:20 +0800 CST

如何从日期列表中创建日期间隔

  • 0

如何从日期列表中创建日期间隔(按 A 和 C 列分组,日期范围由连续的日期序列组成):

在此处输入图像描述

sql-server sql-server-2005
  • 1 个回答
  • 71 Views
Martin Hope
MrVimes
Asked: 2020-01-08 04:11:55 +0800 CST

仅当没有完全匹配的记录时才加入“默认”值

  • 1

仅当左表中的两个字段都没有匹配的记录时,我才需要能够加入表(右表)中的“默认”行。以下是表格的原始内容

#lefttable
--------------------
value  program  race
100    gold     1
100    gold     4
100    gold     5


#righttable
-------------------------
commission  program  race
14          GOLD     1
23          GOLD     NULL

在此示例中,比赛为 1,我需要选择第一行(佣金 = 14),但如果比赛不是 1,我需要选择与其他字段匹配的 NULL 行(佣金 = 23)

我遇到的问题是我的查询在加入时选择了空记录和匹配记录,导致重复......

SELECT #lefttable.race,
       totalvalue = SUM(value),
       commission = SUM(value * (commission * 0.01))
  FROM #lefttable
  LEFT JOIN #righttable  ON #lefttable.program = #righttable.program
                        AND #lefttable.race = ISNULL(#righttable.race, #lefttable.race)
 GROUP BY #lefttable.race;

这导致以下结果

--------------------
race  totalvalue  commission
1     200         37.00
3     100         23.00
4     100         23.00

总价值是应有的两倍(并且佣金不正确),因为连接为比赛 1 创建了两行(右表中的每一行都有一个)

理想情况下,我希望能够完全在 join 子句中解决这个问题,而不必在 select 子句中添加杂乱的 cluds,或者额外的连接或视图,或者修改 righttable 以无论如何为每场比赛创建一行。

我尝试了不同的方法来构建连接子句,但我不能完全理解如何使用 sql 连接说“只有在没有与 lefttable 中的比赛匹配的行时才给我带有空比赛的行”。

这可能吗?

sql-server-2005
  • 1 个回答
  • 1935 Views
Martin Hope
Jack Casas
Asked: 2019-03-27 02:57:08 +0800 CST

64 位 Windows 2008 Server Standard 上的 32 位企业 SQL 2005。内存配置

  • 1

做一个项目,我们需要先稳定,然后再升级。

我们在 64 位 Windows 2008 标准服务器上安装了 32 位企业版 SQL Server 2005。

服务器安装了 64GB RAM,但是在 taskmgr 中只有 32GB 可用。我相信这是一个标准的 Windows Server 限制,只是想确认一下。

在此处输入图像描述

另一方面,我们检查了 perfmon 上的 SQL Server 内存计数器,我们得到的目标内存和总内存的值约为 3.500.000,所以我猜 SQL Server 使用了大约 3,5GB??

在此处输入图像描述

我想问一下我们需要进行哪些配置才能让 SQL Server 使用尽可能多的内存,希望是 28 GB,为操作系统留出 4GB,因为我们在这台机器上没有其他服务。

到目前为止,这是我的计划,但由于它是一个生产环境,我最好一次尝试就搞定它,因为不想多次停止服务:

  • 服务帐户是 Local System,但我在 SQL Server 日志中看不到“Using locked pages for buffer pool”。我是否需要切换到另一个用户帐户才能利用“内存中的锁定页面”策略?我在 SQL Server 日志中看到的是:“使用动态锁分配。每个节点初始分配 2500 个锁块和 5000 个锁所有者块。这只是一条信息性消息。不需要用户操作。”

  • Max 服务器内存属性设置为 10240;我认为在内存中启用锁定页面后,我需要将其增加到 28000

  • 由于这是 64 位操作系统,因此无需启用 AWE。但是,在 SQL Server 日志中,我可以看到这条消息:“在配置参数中将 AWE Enabled 设置为 1 以允许使用更多内存。”

为了为 SQL Server 启用更多内存,我还需要考虑其他什么?

sql-server-2005 performance
  • 1 个回答
  • 140 Views
Martin Hope
Kevin H
Asked: 2019-01-11 05:31:14 +0800 CST

创建 SQL 作业以发送 Excel 格式的电子邮件

  • 1

我不擅长 SQL,需要一些帮助。我有一个 SQL2005 服务器,我创建了一个作业来发送带有 CSV 附件的电子邮件。我的工作运行良好,但我需要最终结果是 .xls 或 .xlsx 格式的 Excel 文件。

这是作业的代码:

USE My_DB
GO

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DBMail'
    ,@recipients =  'me@my_org.com' 
    ,@copy_recipients = ''
    ,@execute_query_database = 'My_DB'
    ,@query = 'exec MY_RPT_MonthlyWIPSp'
    --@body =@bodyContent
    ,@subject = 'Monthly WIP Report'
    ,@attach_query_result_as_file = 1
    ,@query_attachment_filename = 'result.csv'
    ,@query_result_separator=',',@query_result_width =32767
    ,@query_result_no_padding=1;

我需要更改什么以及在哪里以我需要的格式获取数据?我必须修改我的SP吗?

sql-server-2005
  • 1 个回答
  • 4880 Views
Martin Hope
Lee Hill
Asked: 2018-09-18 00:42:40 +0800 CST

SQL Server 事务日志 VLF 未在日志传送数据库上发布(状态 2)

  • 2

看过一些与我的情况类似的帖子,但没有任何内容能真正解决我的问题。

设想:

  • 例行索引重建发生,每周一次,星期六凌晨 2 点。
  • 日志文件增长到通常大小的 15 倍左右。
  • 进行事务日志备份(每 10 分钟,24 x 7)。
  • 每天凌晨 3 点进行完整备份。
  • 当我查看时,VLF 仍处于“活动”状态(状态 2)dbcc loginfo
  • log_reuse_wait_desc正在报告“LOGBACKUP ”sys.databases
  • dbcc opentran报告没有活跃的交易
  • @@version: Microsoft SQL Server 2005 - 9.00.5069.00 (X64) Aug 22 2012 18:02:46 版权所有 (c) 1988-2005 Microsoft Corporation Standard Edition(64 位)在 Windows NT 6.1(Build 7601:Service Pack 1)上

问题:

所以,我的问题很简单,因为硬件限制和时间参数,我需要让事务日志的大小尽可能小。我相信它不释放空间的原因是因为 VLF 处于活动状态并且它认为它需要一个 LOGBACKUP 来释放,但是在无数次日志备份之后,log_reuse_wait_desc仍然报告等待日志备份!

我可以将恢复模型更改为简单、缩小并改回,但这会破坏我的 LSN 链和我的日志传送实现,所以它不是一个真正可行的解决方案!

TIA。

sql-server sql-server-2005
  • 3 个回答
  • 1030 Views
Martin Hope
Jon
Asked: 2018-07-12 08:06:30 +0800 CST

有没有什么办法可以在不重启见证人的情况下添加见证人?

  • 4

我想将 SQL Server 的第三个实例添加到我的镜像对中以充当Witness。当我设置 witness 时,镜像与 witness 保持断开连接,并且镜像的日志会累积错误。有两个不同的错误发生,相同的时间戳每 ~24 秒重复一次。

镜像错误消息 1:

错误:1438,严重性:16,状态:2。

镜像错误消息 2:

服务器实例 Witness 拒绝配置请求;阅读其错误日志文件以获取更多信息。Microsoft 可以使用原因 1451 和状态 3 进行诊断。这是暂时性错误,因此重试请求很可能会成功。纠正原因(如果有)并重试。

我能找到的见证服务器上没有相应的错误。

数据库镜像监视器将在镜像上显示见证连接已断开

数据库镜像监视器

在这个场景中,我有三个 SQL Server 实例。SqlServer01是原理。SqlServer02 是镜像。操作方式安全性高。我试图通过添加 SqlServer03 作为见证来过渡到具有自动故障转移的高安全性。

所有实例都运行相同版本的 SQL Server 2005,9.00.5292。

身份验证是通过具有证书的 SQL Server 用户进行的。

到目前为止我找到的唯一解决方案是在见证服务器上重新启动 SQL Server。有没有更好的办法?为什么见证人需要重启?

我真的很想避免重新启动见证人,因为当我在我的生产环境中设置它时,见证人也是单独镜像对的一部分,它们有自己单独的见证人。因此,在一台服务器上重新启动 SQL Server 将导致该服务器上所有主体数据库的故障转移。

sql-server sql-server-2005
  • 1 个回答
  • 466 Views
Martin Hope
ContractDeebz
Asked: 2018-06-28 02:12:44 +0800 CST

继承的权限:SQL Server 2005 与 2016

  • 0

问题:

  • 我有一个 SQL Server 2005 服务器和一个 SQL Server 2016 服务器。
  • 每台服务器上都有一个数据库 (A),其中包含一个存储过程,用于从数据库 (A) 的视图中选择数据
  • 数据库 (A) 中的视图引用同一服务器上数据库 (B) 中的表
  • 我使用的登录仅对数据库 (A) 上的存储过程具有执行权限。
  • 此设置对于两台服务器都是相同的。
  • 在 2005 服务器上,我可以按照所描述的登录方式运行 SP,并通过数据库 (A) 中的视图从数据库 (B) 中的表检索数据——如我所料。
  • 在 2016 服务器上,我收到一个错误,因为从数据库 (A) 我无法通过 SP 和视图从数据库 (B) 的表中选择数据。

两台服务器都运行 SQL Server Standard Edition -(虽然一台是 2005 年,一台是 2016 年)。

总结一下:

SQL Server 2005

  • 数据库 A = 视图 = 数据库 B 中的表
  • 数据库 A = 存储过程 = 从视图中选择
  • LOGON = 仅在存储过程中执行
  • 结果 = 成功

SQL Server 2016

  • 设置看起来完全相同
  • 结果 = 失败

为什么是这样?这两个版本的 SQL 在权限继承方面有何不同?我想念的东西很明显吗?

任何指针都会非常有帮助!

sql-server-2005 sql-server-2016
  • 1 个回答
  • 339 Views
Martin Hope
WickedNet
Asked: 2018-05-05 06:25:26 +0800 CST

UPDATE 结合嵌套的 SELECT 查询和 LEFT OUTER JOIN

  • 1

我对包含嵌套 SELECT 语句和 LEFT OUTER JOIN 语句的 UPDATE 语句有疑问。

情况:在我们的数据库中,向我们数据库中的所有人添加了一个新列,我想在某些人上更新值为“X”的列,但仅限于具有某些条件的人。

通过以下 SELECT 语句,我成功选择了所有需要更新此列的人。我要更新的列是“Testfield”

SELECT
    TESTDB.CONTACT.number2 AS CustomerID,
    TESTDB.PERSON.firstname AS FirstName,
    TESTDB.PERSON.lastname AS LastName,
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) AS Testfield
FROM         
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'A'
    OR  (SELECT UPPER(string07) FROM CRM5.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'B'
    OR  (SELECT UPPER(string08) FROM CRM5.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'C')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'
ORDER BY
    CustomerID, FirstName, LastName

输出:

10001;Test1;Person1;
10001;Test2;Person2;
10001;Test3;Person3;
10001;Test4;Person4;
10001;Test6;Person6;
10001;Test7;Person7;
10001;Test8;Person8;

(7 rows affected)

这是正确的,人们目前在 Testfield 上的值为 NULL。(第四栏为空)

现在我想更新“Testfield”列,到目前为止尝试了这个:

UPDATE
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
SET
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'J'
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'A'
    OR  (SELECT UPPER(string07) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'B'
    OR  (SELECT UPPER(string08) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'C')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'

但是在这里我得到了它不接受放置在这里的 LEFT OUTER JOIN 的错误:

Msg 156, Level 15, State 1, Server TESTSERVER, Line 3
Incorrect syntax near the keyword 'LEFT'.
Msg 156, Level 15, State 1, Server TESTSERVER, Line 7
Incorrect syntax near the keyword 'SET'.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 7
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 15
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 16
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 17
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 19
Incorrect syntax near '='.

我也试过这样:

UPDATE
    TESTDB
SET
    (SELECT UPPER(string19) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
FROM
    TESTDB.CONTACT 
    LEFT OUTER JOIN TESTDB.PERSON ON TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id
    LEFT OUTER JOIN TESTDB.UDPERSONSMALL ON TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.udpersonSmall_id 
    LEFT OUTER JOIN TESTDB.UDCONTACTLARGE ON TESTDB.CONTACT.userdef2_id = TESTDB.UDCONTACTLARGE.udcontactLarge_id
WHERE 
    (TESTDB.CONTACT.contact_id = TESTDB.PERSON.contact_id) 
/*  No retired people*/
    AND TESTDB.PERSON.retired = '0'
/*  Other conditions*/
    AND ((SELECT UPPER(string05) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
    OR  (SELECT UPPER(string07) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X'
    OR  (SELECT UPPER(string08) FROM TESTDB.UDPERSONSMALL WHERE TESTDB.PERSON.userdef_id = TESTDB.UDPERSONSMALL.UDPERSONSMALL_id) = 'X')
/*  testpersonen*/
    AND (SELECT string45 FROM TESTDB.UDPERSONLARGE WHERE TESTDB.PERSON.userdef2_id = TESTDB.UDPERSONLARGE.UDPERSONLARGE_id) = '123'

这导致另一个错误:

Msg 102, Level 15, State 1, Server TESTSERVER, Line 4
Incorrect syntax near '('.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 4
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 17
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 18
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 19
Incorrect syntax near '='.
Msg 102, Level 15, State 1, Server TESTSERVER, Line 21
Incorrect syntax near '='.

该软件是一个带有 SQL Server 2005 数据库的 CRM。

有人可以帮我语法吗?我要迷路了。

提前致谢。

sql-server sql-server-2005
  • 2 个回答
  • 2266 Views
Martin Hope
Giri Bkm
Asked: 2018-03-27 18:42:56 +0800 CST

如何知道该执行计划是否适合此查询(Sql server 2005)?

  • 1

这是我的查询。

Declare
    @Pivv NVarchar(Max),
    @Query NVarchar(Max),
    @Pivv1 NVarchar(Max),
    @Columns NVarchar(Max)

Select
    @Pivv = Coalesce(@Pivv + ',' , '') + 
            Quotename(MatchType + '_' + '_Name'),
    @Pivv1 = Coalesce(@Pivv1 + ',' , '') + 
             Quotename('HighestRunsAndWicketsIn' + MatchType),
    @Columns = Isnull(@Columns + ',', '') +
               'Max(' + (MatchType + '_' + '_Name') + ') As ' + (MatchType + '_' + '_Name') +
               ',' +
               'Max(' + ('HighestRunsAndWicketsIn' + MatchType) + ') As ' + ('HighestRunsAndWicketsIn' + MatchType)
From
    PlayersCareerBatting t Join PlayersBioDataNew a
On
    t.Id=a.Id
Group By
    MatchType

Set @Query=
        'Select
            ''Batting'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Runs1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    RunsScored As Runs
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName, 
                            MatchType, 
                            RunsScored
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    RunsScored, 
                                    Row_Number() Over(Partition By MatchType Order By RunsScored Desc) rn
                                From 
                                    PlayersCareerBatting s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x
                        Where rn=1
                     ) x2
             ) x3
        Pivot 
            (
                Max(Runs1) For Type1 In (' + @Pivv + ')
            ) x4
        Pivot
            (
                Max(Runs) For Type In (' + @Pivv1 + ')
            ) x5

        Union All

        Select
            ''Bowling'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Wickets1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    Wickets As Wickets
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName,
                            MatchType, 
                            Wickets
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    Wickets, 
                                    Row_Number() Over(Partition By MatchType Order By Wickets Desc) rn
                                From 
                                    PlayersBowlingCareer s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x6
                        Where rn=1
                     ) x7
             ) x8 
        Pivot 
            (
                Max(Wickets1) For Type1 In (' + @Pivv + ')
            ) x9
        Pivot
            (
                Max(Wickets) For Type In (' + @Pivv1 + ')
            ) x10'

Exec(@Query)

查询包含 3 个表。Playersbiodatanew(5000 行),players?careerbatting(20000 行),playersbowlingcareer(20000 行)。而且,我在该查询中创建了数据透视表。现在我想知道,该查询是否更适合下面提到的执行计划

执行计划

执行计划

执行计划

执行计划链接,https://www.brentozar.com/pastetheplan/?id=SyJPRDs9M

样本数据

对于桌上玩家BioDataNew

Id | Firstname | middlename | lastname
----------------------------------------
1  | Sachin    | Ramesh     | Tendulkar
----------------------------------------
2  | Suresh    | Kumar      | Raina
----------------------------------------

对于桌上玩家职业击球

CareerId | Id | Matchtype | runsscored
---------------------------------------
1        | 1  | Test      | 15921
----------------------------------------
2        | 1  | ODI       | 18426
----------------------------------------
3        | 1  | T20I      | 10
----------------------------------------
4        | 1  | IPL       | 2334
----------------------------------------
5        | 2  | Test      | 768
----------------------------------------
6        | 2  | ODI       | 5568
----------------------------------------
7        | 2  | T20I      | 1498
----------------------------------------
8        | 2  | IPL       | 4540
----------------------------------------

对于桌球运动员保龄球职业

CareerId | Id | Matchtype | wickets
---------------------------------------
1        | 1  | Test      | 46
----------------------------------------
2        | 1  | ODI       | 154
----------------------------------------
3        | 1  | T20I      | 1
----------------------------------------
4        | 1  | IPL       | 0
----------------------------------------
5        | 2  | Test      | 13
----------------------------------------
6        | 2  | ODI       | 36
----------------------------------------
7        | 2  | T20I      | 13
----------------------------------------
8        | 2  | IPL       | 25
----------------------------------------

预期产出

(No Column Name) | IPL__Name | HighestRunsAndWicketsInIPL | Test__Name | HighestRunsAndWicketsInTest | T20I__Name | HighestRunsAndWicketsInT20I | ODI__Name | HighestRunsAndWicketsInODI
----------------------------------------------------------------------------
Batting | Suresh Kumar Raina | 4540 | Sachin Ramesh Tendulkar | 15921 | Suresh Kumar Raina | 1498 | Sachin Ramesh Tendulkar | 18426
----------------------------------------------------------------------------
Bowling | Suresh Kumar Raina | 25 | Sachin Ramesh Tendulkar | 46 | Suresh Kumar Raina | 13 | Sachin Ramesh Tendulkar | 154
----------------------------------------------------------------------------

我得到了每个匹配类型获得最大跑分和小门的输出。

sql-server sql-server-2005
  • 1 个回答
  • 131 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve