小编Han*_*non的帖子

存储过程中的事务

我需要在单个事务中执行 UPDATE 和 INSERT。该代码本身运行良好,但我希望能够轻松调用它并传入所需的参数。当我尝试将这个事务嵌套在一个存储过程中时,我遇到了很多语法错误。

如何封装以下代码以便轻松调用?

BEGIN TRANSACTION AssignUserToTicket
GO

DECLARE @updateAuthor varchar(100)
DECLARE @assignedUser varchar(100)
DECLARE @ticketID bigint

SET @updateAuthor = 'user1'
SET @assignedUser = 'user2'
SET @ticketID = 123456

    UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID);
    INSERT INTO [dbo].[tblTicketUpdate]
           ([ticketID]
           ,[updateDetail]
           ,[updateDateTime]
           ,[userSamAccountName]
           ,[activity])
     VALUES
           (@ticketID,
           'Assigned ticket to ' + @assignedUser,
           GetDate(),
           @updateAuthor,
           'Assign');
GO
COMMIT TRANSACTION AssignUserToTicket
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql transaction sql-server-2012

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

表中的NULL值自我比较

我总是对一些神秘的 t-sql 行为感到困惑,如下所示

-- Create table t and insert values.  
use tempdb
CREATE TABLE dbo.t (a INT NULL);  
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);  
GO  
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a 
Run Code Online (Sandbox Code Playgroud)

这不是关于如何检索表中的所有行,也不是关于避免使用 ANSI_NULLS。

我只是想征求一些见解,为什么 t-sql 会这样。

sql-server t-sql sql-server-2012

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

创建表时如何添加默认约束?数据库服务器

我正在尝试创建一个新表,其中的列后跟它们的约束,如下所示。

Create tblTest(
columns..
..
..
Gender int,
Constraint DF_tblTest_Gender Default 3 For Gender,
..
..
..
)
Run Code Online (Sandbox Code Playgroud)

但是,我在默认约束附近收到一条错误消息,

'for' 附近的语法不正确

sql-server constraint sql-server-2016

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

SET NOCOUNT 升级后处理 SQL 调用时出错

我们正在使用新服务器和更新版本的 Microsoft SQL Server 升级我们的测试环境,但遇到了问题。

在新服务器上,我们的旧代码在执行某些存储过程时会出现“对象关闭时不允许操作”。此消息从未出现在旧服务器上。当我们追踪到它时,可以通过添加SET NOCOUNT ON;到存储过程来解决问题。

我查看了数据库上的默认值,没有看到与默认值相关的不同设置(SQL Server 2008 与 SQL Server 2014)。

我应该查看什么设置来全局解决此问题,而无需添加SET NOCOUNT ON到一千个存储过程?

sql-server-2008 sql-server sql-server-2014 sp-configure

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

大内存环境中的 SQL Server TempDB 行为

读完这个问题让我想起了我不久前的一个问题。

我们有一个具有 512GB RAM 的 SQL Server,主数据库是 450GB。我们在 TempDB 中看到了很多动作(好吧,我认为这是“相当多的动作”——可能不是!)。我安装了 RamDisk Plus Server 的演示版,创建了一个 50GB 的 ramdrive,将 TempDB 指向它,但并没有看到性能有任何改善。

写入 TempDB 是否总是导致对磁盘的实际物理写入,或者 TempDB 写入是否由 SQL Server 缓存以便像在 Windows 文件系统缓存中那样延迟写入?

在这种情况下,ramdisk 毫无意义吗?

我知道 SQL Server 6.5 支持 TempDB-In-Ram,但我看到它很久以前就停产了!

performance sql-server-2005 sql-server tempdb

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

尝试在数据库 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万
查看次数

我应该在数据仓库场景中禁用“自动更新统计”吗?

我在 SQL Server 中有 200 GB 的数据仓库。

对于某些查询,我遇到了非常缓慢的执行时间;例如delete,使用inner join.

在对执行计划进行了一些研究之后,我使用该WITH FULLSCAN选项更新了查询中涉及的 2 个表的统计信息。

查询现在在不到一秒的时间内执行,因此统计信息似乎不是最新的。

我正在考虑禁用auto update statistics数据库并UPDATE STATISTICS在加载数据仓库后手动运行。每天晚上从源 ERP 系统增量加载数据仓库。

我假设auto update statistics在数据仓库场景中不是真的有用吗?相反,在数据加载后手动更新统计数据是否更有意义?

data-warehouse sql-server statistics

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

编写维护计划脚本

我使用 SQL Server Management Studio (SSMS) 为我的 SQL Server 2008 R2 创建了维护计划。

但是,我无法将其导出/转换为脚本,以防我需要在另一台服务器上重做。

有办法吗?

如果没有,是否有更新版本的 SQL Server 的方法?

sql-server sql-server-2008-r2 maintenance-plans

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

CONVERT() 出现此问题的原因是什么?

考虑以下两个语句:

PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Run Code Online (Sandbox Code Playgroud)

两个语句都返回-1;这不是不正确,因为第二个二进制值比第一个值高 65,536 十进制,不是吗?

这肯定不是由于无声截断?

如果我运行以下语句:

PRINT CONVERT(NUMERIC(38, 0),   0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0),   0x00010001, 0);
Run Code Online (Sandbox Code Playgroud)

我遇到了以下错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Run Code Online (Sandbox Code Playgroud)

我如何诊断这里发生了什么?

我在 SQL Server 2012 v11.0.5058 上运行它。结果在 SQL Server 2008 R2 SP2、SQL Server 2005 和 SQL Server 2000 上相同。

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

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

CREATE TABLE SomeSchema.#TempTableName 有错误吗?

简单的试验台:

USE tempdb;
GO

/*
    This DROP TABLE should not be necessary, since the DROP SCHEMA
    should drop the table if it is contained within the schema, as
    I'd expect it to be.
*/
IF COALESCE(OBJECT_ID('tempdb..#MyTempTable'), 0) <> 0 
    DROP TABLE #MyTempTable;

IF EXISTS (SELECT 1 FROM sys.schemas s WHERE s.name = 'SomeSchema') 
    DROP SCHEMA SomeSchema;
GO

CREATE SCHEMA SomeSchema AUTHORIZATION [dbo]
CREATE TABLE SomeSchema.#MyTempTable /* specifying the schema
                                        should not be necesssary since
                                        this statement is executed inside
                                        the …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 sql-server-2012 tempdb

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