我有一个始终处于高可用性模式的数据库与不同实例上的另一个数据库同步。如何.bak使用将文件从文件还原到主数据库T-SQL?
我是高可用性的新手,有人建议我需要先将数据库从高可用性中移除,然后才能进行还原,然后再次将其恢复为高可用性,但我不确定。
我希望我可以在AlwaysOn仍然启用的情况下直接恢复到主服务器,并且它会自动与辅助服务器同步。
sql-server t-sql restore sql-server-2012 availability-groups
在设置审计跟踪时,跟踪谁在表中更新或插入记录没有问题,但是,跟踪谁删除记录似乎更成问题。
我可以通过在插入/更新字段中包含“UpdatedBy”来跟踪插入/更新。这允许 INSERT/UPDATE 触发器通过inserted.UpdatedBy. 但是,使用删除触发器不会插入/更新数据。有没有办法将信息传递给删除触发器,以便它知道谁删除了记录?
这是一个插入/更新触发器
ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate]
ON [dbo].[MyTable]
FOR INSERT, UPDATE
AS
INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges)
VALUES (inserted.ID, inserted.LastUpdatedBy)
FROM inserted
Run Code Online (Sandbox Code Playgroud)
使用 SQL Server 2012
我在AdventureWorks2012数据库中运行此查询:
SELECT
s.SalesOrderID,
d.CarrierTrackingNumber,
d.ProductID,
d.OrderQty
FROM Sales.SalesOrderHeader s
JOIN Sales.SalesOrderDetail d
ON s.SalesOrderID = d.SalesOrderID
WHERE s.CustomerID = 11077
Run Code Online (Sandbox Code Playgroud)
如果我查看估计的执行计划,我会看到以下内容:

初始索引查找(右上角)使用 IX_SalesOrderHeader_CustomerID 索引并搜索文字 11077。它估计有 2.6192 行。

如果我使用DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAM,则显示值 11077 介于两个采样键 11019 和 11091 之间。

11019 和 11091 之间不同行的平均数为 2.619718,或四舍五入为 2.61972,这是为索引查找显示的估计行的值。
我不明白的部分是针对 SalesOrderDetail 表的聚集索引查找的估计行数。

如果我运行DBCC SHOW_STATISTICS ('Sales.SalesOrderDetail', 'PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID'):

所以 SalesOrderID(我正在加入)的密度是 3.178134E-05。这意味着 1/3.178134E-05 (31465) 等于 SalesOrderDetail 表中唯一 SalesOrderID 值的数量。
如果 SalesOrderDetail 中有 31465 个唯一的 SalesOrderID,那么在均匀分布的情况下,每个 SalesOrderID 的平均行数为 121317(总行数)除以 31465。平均值为 3.85561
因此,如果估计要循环的行数是 …
sql-server optimization execution-plan sql-server-2012 cardinality-estimates query-performance
查询执行计划默认不显示锁定详细信息,是否可以查看在查询执行期间获取的锁定以及类型?
设置:
create table dbo.T
(
ID int identity primary key,
XMLDoc xml not null
);
insert into dbo.T(XMLDoc)
select (
select N.Number
for xml path(''), type
)
from (
select top(10000) row_number() over(order by (select null)) as Number
from sys.columns as c1, sys.columns as c2
) as N;
Run Code Online (Sandbox Code Playgroud)
每行的示例 XML:
<Number>314</Number>
Run Code Online (Sandbox Code Playgroud)
查询的任务是计算T指定值为 的行数<Number>。
有两种明显的方法可以做到这一点:
select count(*)
from dbo.T as T
where T.XMLDoc.value('/Number[1]', 'int') = 314;
select count(*)
from dbo.T as T
where T.XMLDoc.exist('/Number[. eq 314]') = …Run Code Online (Sandbox Code Playgroud) performance xml sql-server execution-plan sql-server-2012 query-performance
我需要在单个事务中执行 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
我正在运行 SQL Server 2012 并尝试将一些查询放在一起以使用 DMV 进行监控。但是,当查看DMV中的total_elapsed_time字段时sys.dm_exec_requests,这些数字看起来相差甚远。下面是一个例子:
SELECT
session_id, RunTime = CURRENT_TIMESTAMP,
start_time, total_elapsed_time
FROM sys.dm_exec_requests
WHERE session_id = 284;
session_id RunTime start_time total_elapsed_time
284 2016-04-07 16:14:03.690 2016-04-07 16:08:14.587 1419976
Run Code Online (Sandbox Code Playgroud)
根据我的计算*,经过的时间应该在 349,103 左右——而不是 1,419,976。这减少了超过 4 倍。
* 从当前时间和start_time之间的差异,以毫秒为单位,即
SELECT DATEDIFF(MILLISECOND, '2016-04-07T16:08:14.587', '2016-04-07T16:14:03.690');
这是服务器信息:
SELECT @@VERSION;
Microsoft SQL Server 2012 - 11.0.5592.0 (X64)
Apr 17 2015 15:18:46
Copyright (c) Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack …Run Code Online (Sandbox Code Playgroud) 图片在部门之间转移的服务台票。我们想知道在票打开的每一天,每个票在一天结束时的部门是什么。该表包含每张票的最后一个部门,在该部门发生变化的每一天开放(包括该票最初打开日期和关闭日期的一行)。数据表如下所示:
CREATE TABLE TicketAssigment (
TicketId INT NOT NULL,
AssignedDate DATE NOT NULL,
DepartmentId INT NOT NULL);
Run Code Online (Sandbox Code Playgroud)
我需要的是使用按日期排序的前一个 TicketAssigment 行中的 DepartmentId 为每个 TicketId 填写任何缺失的日期。
如果我有像这样的 TicketAssigment 行:
1, '1/1/2016', 123 -- Opened
1, '1,4,2016', 456 -- Transferred and closed
2, '1/1/2016', 25 -- Opened
2, '1/2/2016', 52 -- Transferred
2, '1/4/2016', 25 -- Transferred and closed
Run Code Online (Sandbox Code Playgroud)
我想要这个输出:
1, '1/1/2016', 123
1, '1/2/2016', 123
1, '1/3/2016', 123
1, '1/4/2016', 456
2, '1/1/2016', 25
2, '1/2/2016', 52
2, '1/3/2016', 52
2, '1/4/2016', …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL Server 表定义如下
CREATE TABLE [dbo].[Production_Detail]
(
[Id] [bigint] NOT NULL DEFAULT (NEXT VALUE FOR [dbo].[Production_Detail_Seq]),
[Meta_Data_ID] INT NOT NULL ,
[Production_Detail_Time] DATETIME NOT NULL,
[Production_Detail_Time_Local] DATETIME NOT NULL,
[Production_Detail_Value] FLOAT NULL,
[IntegratedDM] BIT NOT NULL DEFAULT 0,
[DailyIntegratedDM] BIT NOT NULL DEFAULT 0,
[InsertedDate] DateTime NOT NULL,
[ModifiedDate] DateTime NOT NULL,
CONSTRAINT [PK_Production_Detail] PRIMARY KEY ([Id]),
CONSTRAINT [UK_Production_Detail] UNIQUE ([Meta_Data_Id], [Production_Detail_Time]),
CONSTRAINT [FK_Production_Detail_To_Meta_Data] FOREIGN KEY ([Meta_Data_ID]) REFERENCES [Meta_Data]([Meta_Data_ID])
)
GO
CREATE NONCLUSTERED INDEX [IX_Production_Detail_Production_Detail_Time_Local]
ON [dbo].[Production_Detail] ([Production_Detail_Time_Local])
INCLUDE …Run Code Online (Sandbox Code Playgroud) 我总是对一些神秘的 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-2012 ×10
sql-server ×9
t-sql ×3
optimization ×2
audit ×1
date ×1
delete ×1
dmv ×1
index ×1
locking ×1
performance ×1
restore ×1
transaction ×1
trigger ×1
xml ×1