标签: sql-server-2008

将 UPDATE 语句的 OUTPUT 定向到局部变量

我想这样做:

DECLARE @Id INT;

UPDATE Logins
SET    SomeField = 'some value'
OUTPUT @Id = Id
WHERE  EmailAddress = @EmailAddress -- this is a parameter of the sproc
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?我知道我可以声明一个本地表变量并将输出定向到那里,但如果可能的话我宁愿跳过它

sql-server-2008 sql-server sql-server-2012 update output-clause

12
推荐指数
1
解决办法
6191
查看次数

尝试在数据库 2 中获取逻辑页 (5:65424) 失败

SqlException在调用存储过程时得到以下信息:

尝试在数据库 2 中获取逻辑页 (5:65424) 失败。它属于分配单元 7349876362857938944 不属于 4899918190390149120。

System.Data.SqlClient.SqlException发生
Message="Attempt to fetch logical page (5:65424) in database 2 failed. 它属于分配单元 7349876362857938944 不属于 4899918190390149120。

Source=".​​Net SqlClient Data Provider"
ErrorCode=-2146232060
Class=21
LineNumber=257
Number=605
Procedure="ispDisplayCount"
Server="10.10.1.1"
State=3

这个异常是什么意思?以上问题有解决办法吗?

尽管上述错误中引用的数据库表示 tempdb,但引用消息 605 的类似错误可以使用以下答案进行修复。

消息 605,级别 21,状态 3,第 1 行
尝试获取数据库 7 中的逻辑页 (1:8687634) 失败。它属于分配单元 72057594364821504 不属于 72057594052476928。

sql-server-2008 sql-server corruption

12
推荐指数
3
解决办法
4万
查看次数

如何将分钟添加到时间数据类型?

我有一个将两条记录插入到表中的存储过程,记录之间的区别在于第二条记录的时间列在第一条@MinToAdd之后:

CREATE PROCEDURE CreateEntry
    /*Other columns*/
    @StartTime time(2),
    @EndTime time(2),
    @MinutesToAdd smallint
    AS
BEGIN
    SET NOCOUNT ON;

    SET @MinutesToAdd = @MinutesToAdd % 1440;   --Prevent overflow if needed?
    IF (@MinutesToAdd > 0)
    BEGIN
    INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
        OUTPUT inserted.id
        VALUES
               (/*Other columns*/ @StartTime, @EndTime),
               (/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
    END
    ELSE
    BEGIN
        /*Whatever ELSE does.*/
    END
END
Run Code Online (Sandbox Code Playgroud)

@MinutesToAdd分钟添加到@StartTime和的正确方法是什么@EndTime
请注意我使用的是time数据类型。

更新
正确答案应包含以下信息:

  • 如何将分钟添加到 time数据类型。 …

sql-server-2008 sql-server

12
推荐指数
1
解决办法
11万
查看次数

为什么sql server需要先把count(*)结果转换成int再与int变量比较?

我的应用程序中有很多查询,其中在 have 子句中,我将 count 聚合函数与 int 变量进行了比较。在查询计划中,我可以在比较之前看到一个implicit_convert。我想知道为什么会发生这种情况,因为根据 sql server 文档,count 函数的返回类型是 int。那么为什么要进行隐式转换来比较两个 int 值呢?

以下是一个这样的查询计划的一部分,其中 @IdCount 被定义为一个 int 变量。

|--过滤器(WHERE:([Expr1022]=[@IdCount]))    
 |--计算标量(DEFINE:([Expr1022]=CONVERT_IMPLICIT(int,[Expr1028],0))) 
  |--Stream Aggregate(GROUP BY:([MOCK_DB].[dbo].[Scope].[ScopeID]) DEFINE:([Expr1028]=Count(*)))

sql-server-2008 sql-server

12
推荐指数
1
解决办法
5494
查看次数

如何在 Sql Server 权限上刷新 AD 安全组

我在 Small Business Server 2003 上使用 Sql Server 2008;客户端正在使用 WinXP。

我向我的 Active Directory 安全组添加了一个用户;为什么这个用户不能立即访问数据库?在 Sql Server 中识别用户之前似乎存在延迟。

我明确地使用 AD 安全组获得权限,这样我就不需要在 Sql Server 中添加单个用户。如此有效,我不需要做任何事情,只需将用户添加到 AD 安全组即可授予访问权限。

但出于某种原因,Sql Server 不会立即识别添加。我已经看过很多次了。我将该用户添加到该组,但该用户要到第二天才能访问数据。它似乎不会实时查询 Active Directory。你能确认是这样吗?

我需要做什么才能使 Sql Server 从 Active Directory 中“刷新”用户列表?

sql-server-2008 permissions active-directory

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

SQL Server 2008 R2 使用事务日志还原 COPY_ONLY 完整备份

在做了一些研究之后,我似乎无法找到这个问题的答案。

背景 我正在尝试设置一个符合以下三个要求的备份计划:

  1. 备份的可靠性,每晚进行完整备份
  2. 可以从中恢复的事务日志备份
  3. 使用的磁盘空间少
  4. 备份必须可在本地访问以供审计工具使用

因此,为了满足这些需求,我正在考虑每周进行完整备份、每天进行差异备份和每小时进行交易。然后每天晚上都会运行一个 copy_only 备份,可以将其运送到异地,这个备份完成后日志链不会被破坏,并且我们在异地拥有可靠的夜间完整备份,而不必占用太多本地磁盘空间。

问题 是否可以从copy_only 备份恢复,然后恢复事务日志。

让我举个例子,让你知道我在说什么。

使用下面的列表,我想知道是否可以恢复 FullbackupCOPY_ONLYC.bak 然后是 TransactionbackupG.trn、TransactionbackupH.trn、最后是 TransactionbackupI.trn

> ---List of Backups---   
FullbackupA.bak 01/01/2013 00:00:00   
>  DifferntialbackupA.bak 02/01/2013 00:00:00 
FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00
>     TransactionbackupA.trn 02/01/2013 01:00:00
>     TransactionbackupB.trn 02/01/2013 02:00:00
>     TransactionbackupC.trn 02/01/2013 03:00:00
>  DifferntialbackupB.bak 03/01/2013 00:00:00 
FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00
>     TransactionbackupD.trn 03/01/2013 01:00:00
>     TransactionbackupE.trn 03/01/2013 02:00:00
>     TransactionbackupF.trn 03/01/2013 03:00:00
>  DifferntialbackupC.bak 04/01/2013 00:00:00 
FullbackupCOPY_ONLYC.bak 04/01/2013 00:00:00
>     TransactionbackupG.trn 04/01/2013 01:00:00
>     TransactionbackupH.trn 04/01/2013 02:00:00
> …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 backup transaction-log

12
推荐指数
1
解决办法
6392
查看次数

链接服务器风险

我正在实施一项新功能,该功能需要来自多台服务器上的数据库的数据。我只需要合并来自所有这些服务器的数据并对其进行排序。想到的两个选项是:

  1. 使用链接服务器并编写一个简单的查询来合并和排序将从一台服务器运行并从其他服务器收集数据的数据。

  2. 使用应用程序从所有服务器收集数据,并将其发送回 SQL Server 进行排序(不想在应用程序中实现排序)。

我们在 SQL Server 2008 r2 的主动/主动集群中运行我们的服务器。所有数据库都具有相同的权限,如果您有权访问一个数据库/服务器,则您对它们都有权限。这是一个面向公众的应用程序(需要用户登录)。

使用链接服务器有哪些风险?是否有任何我应该关注的安全漏洞?在主动/主动集群中运行链接服务器是否有任何问题?与替代方案相比,是否存在任何重大的性能问题?

关于链接服务器似乎有普遍的负面“嗡嗡声”,但我找不到任何具体的东西让我相信那里有任何真正的担忧。

performance sql-server-2008 security sql-server linked-server

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

SQL Server 中的最大内存设置

我在单个专用服务器上运行 SQL Server 2008 和基于 Web 的应用程序,只有 2Gb 可用内存。

正如其他地方所指出的,SQL Server 经常占用多达 98% 的物理内存,这似乎会减慢服务器上运行的 Web 应用程序的速度。

在 SSMS 的服务器属性中,在内存下,最大服务器内存(以 Mb 为单位)设置为:2147483647 数据库服务器

我的问题是,考虑到我可用的内存量,并且同一台服务器也在运行 Web 应用程序,建议放入最大服务器内存框的数量是多少?

此外,在 SQL Server 运行时更改此数字是否安全?

感谢您的意见。

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

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

更新一个包含数百万条记录的表,已经 4 天了

我目前正在更新一个包含数百万条记录的表,已经 4 天了,查询仍在执行。

我检查了活动监视器,它显示查询正在运行。

在事件日志中根本没有错误。

性能明智:

  • 磁盘 A 中的 Tempdb(850 GB 可用空间)
  • 磁盘 B 中的数据库文件(750 GB 可用空间)
  • 16 GB 内存

请建议我该怎么办?

查询

UPDATE
    dbo.table1
SET 
    costPercentage = ISNULL(t2.PaymentIndex, 1.0),
    t2.TopUp_Amt = (ISNULL(t2.PaymentIndex, 1.0) - 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00),
    Total_Tariff_Inc_t2 = ISNULL(t2.PaymentIndex, 1.0)
    * ISNULL(dbo.table1.Initial_Tariff_Amt, 0.00)
FROM
    dbo.table2 t2
WHERE
    LEFT(dbo.test1.procodet, 3) = LEFT(t2.ProviderCode, 3) COLLATE database_default 
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

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

快速将 NULL 列更改为 NOT NULL

我有一个包含数百万行和一个允许 NULL 值的列的表。但是,当前没有一行具有该列的 NULL 值(我可以通过查询快速验证这一点)。但是当我执行命令时

ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
Run Code Online (Sandbox Code Playgroud)

相对而言,查询需要永远。它实际上需要 10 到 20 分钟,是添加检查约束的两倍多。有没有办法立即更新该列的表元数据,尤其是因为我知道该列没有任何行具有 NULL 值?

sql-server-2008 null alter-table

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