标签: sql-server-2008

如何通过 SQL Server 代理从计划作业运行批处理文件

我正在尝试从 SQL Server 2008 R2 下的 SQL Server 代理作业中运行 (Windows) 批处理文件。在作业步骤中,我创建了一个新步骤,将其类型设置为“操作系统 (CmdExec)”。我最初尝试只将批处理文件名放在“命令”字段中。它给出了找不到文件的错误。

然后我尝试: cmd.exe c:\test.bat

这开始了,但永远不会完成(而且看起来它实际上并不工作)。

我尝试将批处理文件名用引号括起来:cmd.exe "C:\test.bat" 但这也没有任何区别。

让它发挥作用的神奇组合是什么?

sql-server-2008 sql-server

13
推荐指数
1
解决办法
9万
查看次数

死锁错误不返回死锁 SQL

Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

当我的一个网站忙碌时,我会随机收到此错误。我大致知道它发生在哪些表集上,但根据我使用其他程序的经验,我通常会在发生死锁的地方返回 SQL。是否有我应该打开的标志来允许这种情况发生?

我将尝试将死锁本身作为一个单独的问题进行调试,因为这是我目前的主要问题。

我使用的是 SQL Server 2008 标准版。

sql-server-2008 deadlock

13
推荐指数
2
解决办法
9354
查看次数

SQL Server Express Edition 是否支持 CLR 过程?

SQL Server Express Edition(2005 和 2008)是否支持安装、启用和运行 CLR 存储过程和函数。

sql-server-2005 sql-server-2008 sql-server sql-server-express sql-clr

13
推荐指数
1
解决办法
5852
查看次数

如果不存在则插入,同时插入

我在存储过程中的插入有并发问题。该程序的相关部分是这样的:

select @_id = Id from table1 where othervalue = @_othervalue
IF( @_id IS NULL)
BEGIN
    insert into table1 (othervalue) values (@_othervalue)
    select @_id = Id from table1 where othervalue = @_othervalue
END
Run Code Online (Sandbox Code Playgroud)

当我们同时运行 3 个或 4 个这些存储过程时,我们有时会得到多个插入。

我打算像这样解决这个问题:

insert into table1 (othervalue) 
    select TOP(1) @_othervalue as othervalue from table1 WITH(UPDLOCK) 
    where NOT EXISTS ( select * from table1 where othervalue = @_othervalue )

select @_id = Id from table1 where othervalue = @_othervalue
Run Code Online (Sandbox Code Playgroud)

问题是,如何在sql server中并发插入而不重复?我必须使用 TOP 只插入一次的事实让我感到不安。

sql-server-2008 sql-server concurrency

13
推荐指数
2
解决办法
6082
查看次数

槽阵列和总页面大小

我继续在许多论坛和许多博客上看到一个页面的组成如下所示: 页面大小:16 x 512B = 8192B 页眉:= 96B 最大 In_Row 行:= 8060B

这留下 (8192 - 96 - 8060)B = 36B。

好的,这是合乎逻辑且正确的。我的问题是:为什么那么多人说剩下的36B是留给slot array的?

显然,插槽数组在页面上每行给出 2B;所以,它可以小到 2B,大到 1472B:

2B:1 行 * 2B = 2B

1472B:8096B = n*9B(带开销的最小行大小……想想单个 TINYINT 列)+ n*2B(每行槽阵列成本)=> 8096 = 11n => n = 8096 / 11 = 736。

736*2B = 1472B。

由于 14B 版本标签,这使我达到 20。

USE master ;
GO

CREATE DATABASE test ;
GO

USE test ;
GO

ALTER DATABASE test
    SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO

ALTER DATABASE test …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 storage-engine data-pages database-internals

13
推荐指数
1
解决办法
1538
查看次数

在触发器中加入 INSERTED 和 DELETED 表的糟糕性能

我在表上有一个 UPDATE 触发器,用于监视从一个特定值更改为任何其他值的特定列。发生这种情况时,它会通过单个 UPDATE 语句更新另一个表中的一些相关数据。

触发器所做的第一件事是检查是否有任何更新的行的该列的值与相关值发生了变化。它只是将 INSERTED 连接到 DELETED 并比较该列中的值。如果没有任何条件,它会提前退出,因此 UPDATE 语句不会运行。

IF NOT EXISTS (
    SELECT TOP 1 i.CUSTNMBR
    FROM INSERTED i
        INNER JOIN DELETED d
            ON i.CUSTNMBR = d.CUSTNMBR
    WHERE d.CUSTCLAS = 'Misc'
        AND i.CUSTCLAS != 'Misc'
)
    RETURN
Run Code Online (Sandbox Code Playgroud)

在这种情况下,CUSTNMBR 是基础表的主键。如果我对此表进行大量更新(例如 5000 多行),即使我没有触及 CUSTCLAS 列,该语句也需要 AGES。我可以在 Profiler 中看到它在这个语句上停滞了几分钟。

执行计划很奇怪。它显示了具有 3,714 次执行和约 1,850 万行输出的插入扫描。它通过 CUSTCLAS 列上的过滤器运行。它将这个(通过嵌套循环)连接到一个删除扫描(也在 CUSTCLAS 上过滤),它只执行一次并且有 5000 个输出行。

我在这里做了什么愚蠢的事情来导致这种情况?请注意,触发器绝对必须正确处理多行更新。

编辑

我也尝试过这样写(以防 EXISTS 做了一些不愉快的事情),但它仍然一样糟糕。

DECLARE @CUSTNMBR varchar(31)
SELECT TOP 1 @CUSTNMBR = i.CUSTNMBR
FROM INSERTED i
    INNER …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server-2008 sql-server

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

SQL 探查器是否会影响服务器性能?

我面临的问题是 sql server 2008 因某些高负载而失败。我需要找到那个负载情况并需要优化代码以便它可以处理负载。我在 Internet 上发现 SQL 分析器可用于跟踪数据库交互,稍后可以对其进行分析以找到问题发生的确切点。我还发现了如何启动 sql 分析器。但现在我的问题是,通过启动 sql profiler 我会影响服务器性能吗?

performance sql-server-2008 sql-server profiler

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

我可以在不使用集成服务的情况下导出维护计划吗?

我正在尝试从 SQL Server 实例导出一个简单的维护计划。

我想检查导出到源代码管理,并将导出的维护计划应用于功能相同的实例。

StackOverflowSQL Server Newbie建议使用 Integration Services 导出维护计划。

当我尝试连接到导出目标上的集成服务时,我收到以下错误:

连接到计算机“WEBSERVER”上的集成服务服务失败并出现以下错误:指定的服务不作为已安装的服务存在。

我们选择在 WEBSERVER 上禁用集成服务,因为我们仅使用此框为消费者应用程序提供数据。WEBSERVER 上的所有数据都是从后端实例复制的。Integration Services 大量用于处理后端实例上的数据。

是否有不使用集成服务导出维护计划的文档化方法?微软支持吗?

sql-server-2008 sql-server maintenance-plans

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

Merge 语句的锁定选项是什么?

我有一个执行MERGE语句的存储过程。

在执行合并时,它似乎默认锁定整个表。

我在一个事务中调用这个存储过程,我也在做一些其他的事情,我希望它只会锁定受影响的行。

我尝试了提示MERGE INTO myTable WITH (READPAST),它似乎锁定较少。但是ms doc中有一个警告说它可以插入重复的键,甚至绕过主键。

这是我的表架构:

CREATE TABLE StudentDetails
(
StudentID INTEGER PRIMARY KEY,
StudentName VARCHAR(15)
)
GO
INSERT INTO StudentDetails
VALUES(1,'WANG')
INSERT INTO StudentDetails
VALUES(2,'JOHNSON')
GO

CREATE TABLE StudentTotalMarks
(
Id INT IDENTITY PRIMARY KEY,
StudentID INTEGER REFERENCES StudentDetails,
StudentMarks INTEGER
)
GO
INSERT INTO StudentTotalMarks
VALUES(1,230)
INSERT INTO StudentTotalMarks
VALUES(2,255)
GO
Run Code Online (Sandbox Code Playgroud)

这是我的存储过程:

CREATE PROCEDURE MergeTest 
    @StudentId int,
    @Mark int
AS  

WITH Params
AS
(
    SELECT @StudentId as StudentId,
        @Mark …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server merge

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

重建索引,DB 现在大小是原来的 10 倍

我有一个大约 15 个演出的 SQL Server 数据库(2008 R2 SP1)。结果发现维护已经有一段时间没有运行了,所以我创建了一个维护计划来重建所有索引,它们非常分散。

工作完成,碎片消失了,但现在数据库超过 120 个演出!我知道它会使用额外的空间来进行所有重建,但是现在工作已经完成,我认为所有空间都将是可用空间,但可用空间仅显示为 3 个演出,因此正在使用 117 个演出即使索引重建作业已完成。

我很困惑,可以使用一些指导,我让数据库恢复到合理的大小,我们没有磁盘空间。

提前致谢!

这是发布的两个查询的结果:

log_reuse_wait_desc 什么都没有

name    TotalSpaceInMB  UsedSpaceInMB   FreeSpaceInMB
LIVE_Data   152             123             28
LIVE_Log    18939           89              18849
LIVE_1_Data 114977          111289          3688
Run Code Online (Sandbox Code Playgroud)

第三个文件是 .ndf 文件,该文件在未使用空间中仅显示 3688,但 111289 用于大约 15 演出数据。

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

13
推荐指数
2
解决办法
8454
查看次数