标签: sql-server-2008

获取最大序列号 根据其相应金额的总和

我有一个数据表如下:

s_no  amount
1      500
2      500
3      500
4      500
5      500
Run Code Online (Sandbox Code Playgroud)

我需要一个查询来根据 sum(amount) 找到 max(s_no) 例如,当 sum(amount)<=1600 时,我需要 4 作为结果。我可以通过使用游标获得所需的输出,但如果我可以使用查询会更容易。. 我尝试了如下查询:

SELECT MAX(s_no) from table HAVING SUM(amount)<=1600
Run Code Online (Sandbox Code Playgroud)

但它不起作用。我将不胜感激任何形式的帮助。谢谢你。

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

3
推荐指数
1
解决办法
318
查看次数

获取一年的季度数据

我需要一种查询 SQL 表并按季度提取数据的方法。我知道 SQL Server 有一个DatePart()函数,它有一个参数,q = Quarter我想出了这个语法,但是对于一个包含大约 50,000 行的表,这个语法非常慢。这是实现此结果的最佳方法还是可以进行更多优化?

Declare @startdate date = '20170101', @enddate date = '20171231'
Select
Employeename
,[Total Amount Paid] = SUM(ISNULL(Totalcheckamt,0))
FROM dbo.PaymentHistory
WHERE DatePart(q,[DatePaid]) = 1
AND [DatePaid] BETWEEN CAST(DateAdd(yy, -1, @startdate) As Date) 
                   AND CAST(DateAdd(yy, -1, @enddate) As Date)
GROUP BY Employeename
Order By Employeename ASC
Run Code Online (Sandbox Code Playgroud)

编辑
我想要的返回结果是这样的

Employee Name -- Q1 ---   Q2 ---   Q3 ---    Q4
James           XXXXX.XX  XXXX.XX  XXXX.XX   XXXX.XX
Roger           XXXXX.XX  XXXX.XX  XXXX.XX   XXXX.XX
Run Code Online (Sandbox Code Playgroud)

编辑 …

sql-server-2008 t-sql sql-server-2008-r2

3
推荐指数
1
解决办法
4466
查看次数

向字符串添加行尾标记

我们有一个场景,我们需要在从 SQL Server 获取数据时修改输入字符串。

“TEST RATE CODE DESC TEST RATE CODE DESCTST TEST”并且C是“DESCTST”中的第47个字符,然后在单词的开头推入定界符。像“\DESCTST”

例如:

当前 => 测试速率代码 DESC 测试速率代码 DESCTST 测试\

必需 => 测试速率代码 DESC 测试速率代码 DESCTST \TEST

我们已经创建了一个 SQL 函数来实现这一点,除了示例中提到的向后操作外,一切正常。

这是我的 SQL 函数:

ALTER  FUNCTION [dbo].[DescFormatter_New]
(
    @InputString nvarchar(max), 
    @MaxLength int=0,
    @CharPerLine int=0,
    @NoOfLines int=0
)
RETURNS nvarchar(max)
AS
BEGIN   
    DECLARE @ResultText nvarchar(max)
    DECLARE @I INT
    DECLARE @COUNT INT

    IF(LEN(@InputString)<@CharPerLine)
        BEGIN
            SET @ResultText=@InputString
        END
    ELSE
        BEGIN
            set @InputString=LEFT(@InputString,@MaxLength)                              
            SET @I = LEN(@InputString)/@CharPerLine
            
            if((@I*@CharPerLine)<LEN(@InputString))
                BEGIN
                    SET @I=@I+1 
                END         

            SET @COUNT …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

3
推荐指数
1
解决办法
380
查看次数

迁移 7TB 的数据库以进行 Colo 迁移

我们将在未来 3 个月内将我们的数据中心从一个州迁移到另一个州。我想知道,尽可能快地迁移我们最大的数据库之一(即大约 7TB 的大小)的最佳方法是什么。以下是有关服务器和数据库的信息:

  • 现有数据中心:乔治亚州
  • 新数据中心:新泽西

  • 服务器操作系统:Win 2008 R2 Datacenter

  • SQL Server:2008 SP1 企业版
  • 数据存储:XIO 系统(我们不会在新的数据中心获得它)
  • 数据库大小:~7TB
  • 数据如何进入这个数据库:通过来自其他 8 个集群服务器的事务复制。
  • 8 集群如何获取数据:通过每 30 分钟从我们所有 2000 个存储服务器中的合并复制。

我们将在现有数据中心和新数据中心之间建立一个网络管道,但不会那么大。它也将被我们的基础架构团队每天传输的所有 VM 消耗掉。

我们在这个约 7TB 的数据库上运行了完整备份(即带有 iSpeed 设置的 Ideara SQLSafe),耗时约 9 小时,大小为约 630 GB。我们与负责管理我们在两个数据中心之间的 colo 迁移和网络管道的供应商进行了核实,他们说,不可能将超过 640 GB 的文件更快地复制到新的数据中心,我们将不得不执行 Full + Differential + TLOG 获取最新信息。

我们的问题是,我们每 30 分钟从所有商店系统获取一次数据(通过合并复制到家庭办公室),它会产生大量数据更改。如果我们尝试执行 Full + Differential + TLog,我们将遇到相同的大小问题和大量停机时间来复制 Differential,而且我们将不得不处理日志文件变满的问题,我们现有数据库服务器上的空间有限(因为我们不再获得 XIO 存储)。我们正在考虑 SAN 复制,但是,由于我们的 SAN 在新数据中心会有所不同,这对我们不起作用。

你们认为我们应该采取什么方法将这个约 7 TB 的数据库从我们现有的数据中心迁移到新的数据中心,同时停机时间最短?

**注意:如果我错过了信息方面的任何内容,请告诉我。

谢谢,

生命值

sql-server-2008 sql-server migration restore

3
推荐指数
1
解决办法
286
查看次数

创建链接服务器的权限

我有一个对特定数据库具有 DB_Owner 权限的用户。现在,该用户需要为自己创建一个链接服务器。我需要在服务器级别授予该用户什么级别的权限才能创建链接服务器?我不想授予他系统管理员访问权限。我提供了以下访问权限:

Grant control server to login
grant alter any linked server to login
Run Code Online (Sandbox Code Playgroud)

但没有努力创建链接服务器。

sql-server-2008 sql-server sql-server-2008-r2

3
推荐指数
1
解决办法
2万
查看次数

获取 SQL Server 的主要和次要版本

运行以下查询:

SELECT 
    SERVERPROPERTY('productversion') AS version,
    SERVERPROPERTY('ProductMajorVersion') AS major, 
    SERVERPROPERTY('ProductMinorVersion') AS minor;
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

version      major   minor
------------ ------- -------
10.0.2531.0  NULL    NULL
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

sql-server-2008 sql-server

3
推荐指数
1
解决办法
3099
查看次数

基于一行返回一批行

假设我在 SQL Server 2008 中有一个这样的表:

id  |  name  |  qty
-------------------
1   |  john  |    1
2   |  bill  |    3
3   |  mary  |    2
4   |  jill  |    5
Run Code Online (Sandbox Code Playgroud)

我想查询此表并为每批返回 1 行,最多为 2。因此,查询结果如下所示:

id  |  name  |  qty
-------------------
1   |  john  |    1
2   |  bill  |    2
2   |  bill  |    1
3   |  mary  |    2
4   |  jill  |    2
4   |  jill  |    2
4   |  jill  |    1
Run Code Online (Sandbox Code Playgroud)

这可以在不使用光标的情况下整齐地完成吗?这可以使用 unpivot 吗?

顺便说一下,该 …

sql-server-2008 cursors cross-apply unpivot

3
推荐指数
1
解决办法
183
查看次数

将 DBCC LOGINFO 的 CreateLSN 转换为时间

如果我DBCC LOGINFO对我的数据库运行未记录 的字段,则返回的字段之一是 CreateLSN。这是创建 VLF 时格式为 1629000000070500011 的 LSN。现在已经很长时间了,磁盘使用情况报告的自动增长值早已不复存在。我想将 LSN 转换为日期/时间

对于一次性解决方案,我试过这个

select sys.fn_cdc_map_lsn_to_time ( convert(binary,1629000000070500011) )
Run Code Online (Sandbox Code Playgroud)

但我得到了错误

无效的对象名称 'cdc.lsn_time_mapping'

我觉得我错过了一些简单的东西,但它在暗指我。

sys.fn_cdc_map_lsn_to_time (Transact-SQL)

sql-server-2008 functions

3
推荐指数
1
解决办法
1187
查看次数

数据库处于“正在恢复”状态

大家,早安!

我正在使用 SQL SERVER 2008,并且需要使用我们客户端的数据库。当我准备备份以防万一出现问题时,我误点击了进行还原,并且没有注意到我在还原屏幕中并单击了“确定”按钮(没有更改屏幕上的任何配置)。就在它开始执行时,我点击了“立即停止操作”。它停止并出现一条消息,指出用户已取消该操作。到目前为止一切顺利,但是当我要进行真正的备份时,SQL 不允许说已经进行了恢复。当我看到数据库状态为“正在恢复”时。我在互联网上搜索并看到查询:

DATABASE NomeDatabase WITH RECOVERY
Run Code Online (Sandbox Code Playgroud)

会解决我的问题,但在我执行之前,我问我的老板执行这个查询是否有任何问题,他说不要运行查询,因为它会恢复到最近的备份(最近的备份是在 08/23 )。所以我们只有 MDF e LDF 文件,当我们尝试使用此查询进行附加时

EXEC sp_attach_db @dbname = N'DBName', 
    @filename1 = N'C:\PATH\DBName.mdf', 
    @filename2 = N'C:\PATH\DBName_log.ldf'
Run Code Online (Sandbox Code Playgroud)

它给出了这个答案:

消息 1813,级别 16,状态 2,第 1 行无法打开新数据库“DBName”。CREATE DATABASE 已中止。消息 9004,级别 21,状态 1,第 1 行 处理数据库“DBName”的日志时出错。如果可能,从备份中恢复。如果备份不可用,则可能需要重建日志。

我还搜索了此错误消息,发现有必要重建日志,但这里没有人知道该怎么做。我想知道您是否可以帮助我,或者是否有人已经经历过。

这是我进行恢复的屏幕,只需单击“确定”,不更改任何配置:图像

(我的老板分离并删除了数据库以尝试执行附件查询,因此我们不再有SQL上的数据库,只有MDF和LDF文件)

我在网站上看到了一些帖子,但没有一个对我有用。

如果有任何语法错误,谢谢和抱歉!


谢谢你的回答。我也试过这个查询,但没有走运。

无法重建日志,因为在数据库关闭时有打开的事务/用户,数据库没有发生检查点,或者数据库是只读的。如果由于硬件或环境故障手动删除或丢失事务日志文件,则可能会发生此错误。

消息 1813:无法打开新数据库“dbname”。CREATE DATABASE 已中止。

所以我想现在除了恢复8月23日别无他法?它之后所做的一切都完全失去了,是吗?

sql-server-2008 sql-server

3
推荐指数
1
解决办法
415
查看次数

我有来自 SQL Server v7 的数据库备份 (.bak),如何将其转换为加载到 v10?

客户给了我一个来自 SQL Server v 7 数据库的备份 (.bak)。我正在尝试将其加载到不兼容的版本 10。是否有任何工具可以恢复或准备要恢复到版本 10 的旧版本备份?

编辑:根据请求,这是错误对话框中的文本

数据库备份在运行版本 7.00.1063 的服务器上。该版本与运行版本 10.00.1600 的服务器不兼容。在支持备份的服务器上还原数据库,或者使用与此服务器兼容的备份。RESTORE DATABASE 异常终止。(Microsoft SQL Server,错误:3169)

sql-server-2008 sql-server sql-server-2000

3
推荐指数
1
解决办法
1171
查看次数