我需要在单个事务中执行 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
我总是对一些神秘的 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 会这样。
我正在尝试创建一个新表,其中的列后跟它们的约束,如下所示。
Create tblTest(
columns..
..
..
Gender int,
Constraint DF_tblTest_Gender Default 3 For Gender,
..
..
..
)
Run Code Online (Sandbox Code Playgroud)
但是,我在默认约束附近收到一条错误消息,
'for' 附近的语法不正确
我们正在使用新服务器和更新版本的 Microsoft SQL Server 升级我们的测试环境,但遇到了问题。
在新服务器上,我们的旧代码在执行某些存储过程时会出现“对象关闭时不允许操作”。此消息从未出现在旧服务器上。当我们追踪到它时,可以通过添加SET NOCOUNT ON;到存储过程来解决问题。
我查看了数据库上的默认值,没有看到与默认值相关的不同设置(SQL Server 2008 与 SQL Server 2014)。
我应该查看什么设置来全局解决此问题,而无需添加SET NOCOUNT ON到一千个存储过程?
读完这个问题让我想起了我不久前的一个问题。
我们有一个具有 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,但我看到它很久以前就停产了!
我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 中有 200 GB 的数据仓库。
对于某些查询,我遇到了非常缓慢的执行时间;例如delete,使用inner join.
在对执行计划进行了一些研究之后,我使用该WITH FULLSCAN选项更新了查询中涉及的 2 个表的统计信息。
查询现在在不到一秒的时间内执行,因此统计信息似乎不是最新的。
我正在考虑禁用auto update statistics数据库并UPDATE STATISTICS在加载数据仓库后手动运行。每天晚上从源 ERP 系统增量加载数据仓库。
我假设auto update statistics在数据仓库场景中不是真的有用吗?相反,在数据加载后手动更新统计数据是否更有意义?
我使用 SQL Server Management Studio (SSMS) 为我的 SQL Server 2008 R2 创建了维护计划。
但是,我无法将其导出/转换为脚本,以防我需要在另一台服务器上重做。
有办法吗?
如果没有,是否有更新版本的 SQL Server 的方法?
考虑以下两个语句:
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 上相同。
简单的试验台:
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 ×10
t-sql ×2
tempdb ×2
constraint ×1
corruption ×1
performance ×1
sp-configure ×1
statistics ×1
transaction ×1