我有一个大型脚本,用于设置一个新数据库,该数据库在许多表上执行大量身份插入;当我正在扩展它时,由于它正在进行中,我经常遇到暂时性错误。如果这些错误之一介于两者之间set identity_insert [table] on,set identity_insert [table] off并且脚本拒绝第二次运行并显示以下错误:
消息 8107,级别 16,状态 1,第 15 行
IDENTITY_INSERT 已为表“x”打开。无法对表 'y' 执行 SET 操作。
这是一种痛苦!为了解决这个问题,我突出显示“离线”行并手动运行,或者终止连接并重新连接(身份插入是我收集的每个会话)。
我将整个脚本包装在一个事务中,set xact_abort on在顶部,所以我期望服务器返回到错误前的状态。
为什么不是这样?我做错了什么吗,还有比我在这里更强大的方法吗?
以下是重现该行为的最小测试用例。运行两次,注意错误从第一次运行中的类型转换错误到后续运行中的 identity_insert 错误:
-- setup test tables for convenience
if not exists (select * from sys.tables where name = 'bill')
begin
create table bill (id int identity primary key);
end
if not exists (select * from sys.tables where name = 'ben')
begin
create table ben (id int identity primary key, …Run Code Online (Sandbox Code Playgroud) 几年前我读到软删除会提高删除的性能,因为它不会实际删除项目并影响聚集(和所有其他)索引,它只会改变一个值。
我最近尝试了这个,但我的表现非常令人失望。
所以我在网上搜索了一个很好的软删除实现,我最终阅读的第一件事是文章/博客说“软删除是不好的”。
显然,当桌子变大时,它弊大于利......
我不认为我所做的会使表格变得更大,因为每晚(每天)的维护都会删除(真正的)所有标记为删除的行。
那么,软删除真的不利于性能吗?真正的删除是否会导致整个聚簇表完全重新排序(这将是很多磁盘操作!!!)?
performance database-design sql-server delete sql-server-2008-r2
我正在对 SQL Server 中的约束进行审计。
如何找到所有未启用的约束?
在使用下一个声明之后:
alter table mytable nocheck constraint all
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2008 R2。如果正在执行数据库备份(完整/差异/事务日志)并且突然断电或系统崩溃,会发生什么情况?这会损坏备份集吗?
如果是这样,那么有哪些可用选项,以便在需要进行数据库还原时以及何时完成我不会以损坏的备份集结束。
如果不是,那么正在进行的备份的状态是什么?
sys.tables 列出单个数据库中的所有用户表,但没有它们的架构名称。
如果我在创建代码时知道现有数据库,我可以使用它USE来浏览所有数据库,查询sys.tables其表,并将列表插入到临时表中以供以后使用。
但是,有没有更简单的方法来做到这一点,并且通过唯一的查询能够从所有用户数据库中检索所有用户表及其架构?
我很难过,我一直在搜索和研究,直到我的浏览器标签不再显示关闭按钮(“X”),直到您将鼠标悬停在它们上面。我一遍又一遍地尝试重写搜索词,但我想我不知道该问什么,所以如果已经回答了这个问题,我深表歉意。
我试图弄清楚如何将一个 INT 列添加到一个表中,该列从 1 开始并根据另一个列值(我们称之为case_id)递增(我们称此字段版本),如果该值与先前迭代的行 - 如果它不相同,则版本值应重置为 1。
我试图通过更新我创建的临时表或在 SELECT INTO 语句期间添加值来解决这个问题。
此表的目的是存储案例的历史更新记录,由case_id列标识,此版本值与修改时间戳的顺序相同。
将此表结构视为源数据的示例:
---------------------------------
| case_id | modify_time |
---------------------------------
| 1 | 2015-05-01 11:12:13 |
| 1 | 2015-05-02 12:13:14 |
| 1 | 2015-05-03 13:14:15 |
| 2 | 2015-05-01 11:12:13 |
| 2 | 2015-05-01 12:13:14 |
| 3 | 2015-05-02 11:12:13 |
---------------------------------
Run Code Online (Sandbox Code Playgroud)
将此作为我想要实现的最终结果的示例:
-------------------------------------------
| case_id | modify_time | version |
-------------------------------------------
| 1 | …Run Code Online (Sandbox Code Playgroud) 我正在使用扩展事件来跟踪服务器上正在执行的过程及其执行程序的主机名。
我使用了以下 XE 脚本:
CREATE EVENT SESSION [EXEC_SP] ON SERVER
ADD EVENT sqlserver.sp_statement_completed
(
SET collect_statement=(0)
ACTION
(
sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,
sqlserver.nt_username,sqlserver.server_instance_name,
sqlserver.server_principal_name,sqlserver.session_id,sqlserver.sql_text,
sqlserver.transaction_id,sqlserver.username
)
WHERE ( [sqlserver].[is_system]=(0))
)
ADD TARGET package0.asynchronous_file_target
(
SET FILENAME = N'C:\EXEC_SP.xel',
METADATAFILE = N'C:\EXEC_SP.xem'
)
WITH
(
MAX_MEMORY=4096KB,
EVENT_RETENTION_MODE=NO_EVENT_LOSS,
MAX_DISPATCH_LATENCY=15 SECONDS,
TRACK_CAUSALITY=OFF,
STARTUP_STATE=ON
);
Run Code Online (Sandbox Code Playgroud)
但是,正在执行的过程主体内的每个语句都在目标处构成一行。
例如,如果我的程序主体中有 5 个语句,则该事件将被触发 5 次,并且在目标处将有 5 个不同的条目对应于相同的条目。
我只为每个正在执行的过程寻找一个条目,而不是多个条目。
也就是说,正在执行的每个过程都应该只构成 1 行而不是多行。
如何解决这个问题?
SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。
如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?
这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。
在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。
由Select.
SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId) + ', '
+ Convert(varchar(6), @ROIResultId) + ', '
+ CONVERT(varchar(6), RT.routeTypeResultId) + ', '
+ CONVERT(varchar(6), RT.ROI_RouteTypeId) + '; '
FROM @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId
Run Code Online (Sandbox Code Playgroud)
结果
是否连接结果并调用Exec?
我想以这样的方式返回数据,即如果代码具有连续的活动日期和结束日期,则数据应给出最小活动日期和最大结束日期,但如果代码已停止,则应显示两个日期
例如桌子
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| ABC | 1/1/2011 | 30/6/2011 |
|1000| ABC | 1/7/2011 | 30/6/2012 |
|1000| ABC | 1/7/2012 | 30/6/2013 |
|1001| ABC | 1/7/2013 | 30/6/2014 |
|1001| ABC |12/20/2015 |12/20/2017 |
|1003| ABC | 1/1/2011 |30/6/2011 |
|1003| ABC | 1/7/2012 |30/6/2013 |
|1003| ABC | 1/7/2014 |30/6/2015 |
|1003| ABC | 1/7/2015 |12/20/2017 |
+----+------+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
欲望输出
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| …Run Code Online (Sandbox Code Playgroud) 我正在尝试在引用带有屏蔽列的表(SQL Server 2016)的视图上创建索引。屏蔽列不是该表中唯一的列,并且未在视图中使用。
create unique clustered index [IX_Name]
on dbo.vw_ViewName(SomeUniqueId)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
无法创建视图“dbo.vw_ViewName”上的索引,因为该视图正在引用带有屏蔽列的表“dbo.TableName”。
在另一个未启用屏蔽的环境中,索引创建成功。
我浏览了大约四页的 Google 结果,但没有找到任何合理的错误描述。我很感激任何关于错误的知识转移以及为什么不可能创建这样的索引。
这是一些重现问题的 SQL:
drop view if exists dbo.vw_Aggregate
drop table if exists dbo.MainTable, dbo.SecondaryTable
go
create table dbo.MainTable
(
MainTableId uniqueidentifier primary key,
SomeExternalId uniqueidentifier,
SecondaryTableId uniqueidentifier
)
go
create table dbo.SecondaryTable
(
SecondaryTableId uniqueidentifier primary key,
CreatedOn datetime,
Amount decimal(19, 8),
-- the below column produces error,
-- if commented out - there is no error
[Description] nvarchar(max) masked with (function = 'default()'),
Dummy …Run Code Online (Sandbox Code Playgroud) sql-server materialized-view sql-server-2016 data-masking dynamic-data-masking
sql-server ×10
t-sql ×3
alter-table ×2
backup ×1
constraint ×1
data-masking ×1
ddl ×1
delete ×1
dynamic-sql ×1
performance ×1
transaction ×1
update ×1