标签: sql-server-2008

UPSERT - 有没有更好的替代 MERGE 或 @@rowcount 的方法?

不知道大家有没有遇到过类似UPSERT这个概念的T-SQL命令?使用选项 (1) 或 (2) 执行 INSERT|UPDATE 操作似乎过于复杂且容易出错。

客观的

确保所需的记录(在本例中为 employee_id 1)是最新的,而不必实质上编写相同的查询两次。

语境

  • 表名:员工
  • 员工id:有主键,身份属性设置为true

选项

  1. 执行 SQL UPDATE... 检查 @@rowcount = 0 和 @@error = 0 ... 如果需要,执行 SQL INSERT

    • 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
    • con: more code = more time typing
    • con: more code = more room for error

/sf/ask/77470221/ "Update using @@rowcount"

  1. execute a SQL MERGE
    • con: you effectively have to write the same query twice, once as an insert, once as an update
    • con: more code = more time typing
    • con: …

sql-server-2008 upsert

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

对单个数据库的 BULK INSERT 权限

我在一家拥有直接 IT 安全方式的公司工作。我被聘为数据库分析师是为了优化我们团队中的一些流程。问题是我只有读写权限,我正在努力获得数据库的高级权限。目前我们在一台服务器上有很多数据库,我们只能在一个数据库上工作,我想知道是否BULK INSERT可以将权限授予单个数据库还是整个服务器的权限?

我已经通过网络搜索了这个,但我有点困惑。这是我发现的。为了使用 BULK INSERT,我应该拥有INSERT所需表或数据库的权限,并且ADMINISTER BULK OPERATIONS这是服务器范围的权限。如果我获得了ADMINISTER BULK OPERATIONS对整个数据库的INSERT权限和对单个数据库的权限,我是否只能BULK INSERT在该单个数据库中执行此操作,因为我没有INSERT对其他数据库的权限?

是否可以将使用限制为BULK INSERT具有多个数据库的服务器上的单个数据库?

对不起文字墙,谢谢!

sql-server-2008 sql-server

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

为范围内的每个日期返回一列

假设我有表 A:BookingsPerPerson

Person_Id    ArrivalDate    DepartureDate
123456       2012-01-01     2012-01-04
213415       2012-01-02     2012-01-07
Run Code Online (Sandbox Code Playgroud)

我需要通过视图实现以下目标:

Person_Id    ArrivalDate    DepartureDate    Jan-01    Jan-02    Jan-03    Jan-04    Jan-05    Jan-06    Jan-07
123456       2012-01-01     2012-01-04       1         1         1         1
213415       2012-01-02     2012-01-07                 1         1         1         1         1         1
Run Code Online (Sandbox Code Playgroud)

该系统用于活动,因此每次酒店预订可能需要 1 到 15 天的时间,但不会超过此时间。任何想法将不胜感激。

sql-server-2008 sql-server pivot

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

SQL Server 中的 ERROR_STATE() 是什么以及如何使用它?

我读到这ERROR_STATE()有助于区分源代码中可能发生相同类型错误的不同状态/位置。但我并不清楚它如何有用。

MSDN 指出:

ERROR_STATE() 返回导致运行 TRY…CATCH 构造的 CATCH 块的错误的状态编号。

如何真正使用它?有人可以举个例子吗,这篇参考文章中提供的那些并不能真正帮助我很好地解释事情?

sql-server-2008 sql-server error-handling

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

一个简单的选择查询是否获取锁?

我对 SQL Server 很陌生,想了解以下非常简单的select语句是否需要任何锁。

Select * from Student;
Run Code Online (Sandbox Code Playgroud)

请考虑语句不会在begin tran块内运行的情况。

sql-server-2008 sql-server locking

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

有必要在非聚集索引中包含聚集索引列吗?

考虑到非聚簇索引是基于聚簇索引的,非聚簇索引是否有必要列出聚簇索引中包含的任何列?

换句话说,如果 Products 表包含 ProductID 上的聚集索引,那么在创建非聚集索引时建议包含 ProductID 列时,是否有必要将其添加为列?

如果没有,是否有将列名添加到非聚集索引的情况?

sql-server-2005 sql-server-2008 nonclustered-index

15
推荐指数
1
解决办法
5081
查看次数

删除名称中包含不可打印字符的表格

我有一个旧表,其名称包含不可打印的字符(CHAR(31),具体来说)。

不可打印的字符位于下划线旁边,我发现快捷方式CTRL+SHIFT+_创建了该CHAR(31)字符(这意味着“美国” - 单位分隔符)。以前的开发人员可能会错误地使用这个组合,并创建了包含这个奇怪字符的表格。

当我们SELECT对表发出命令时,它会返回结果。但是,当我们试图发出反对任何DDL( ,DROPsp_rename等),字符会导致一个问题。

例子:

DROP TABLE Table_Name;
Run Code Online (Sandbox Code Playgroud)

提高:

消息 15225 - 在当前数据库 'MyDB' 中找不到名为 'Table_Name' 的项目,因为@itemtype 被输入为 '(null)'。

EXEC sp_rename N'Table_Name', N'NewTableName'; 
Run Code Online (Sandbox Code Playgroud)

提高:

消息 102 - '_Name' 附近的语法不正确。

我已经用正确的名称复制了表,并在相关对象上更正了它。剩下的步骤就是将它从数据库中删除。

只是一个见解:当我们从 SQL Server 复制+粘贴到 Notepad++ 时,它会在表名中间显示隐藏字符(“US”),在下划线旁边:

单位分隔符 (CHAR(31)) 字符

sql-server-2008 sql-server ddl

15
推荐指数
1
解决办法
1323
查看次数

将 10-20 个 SQL Server 数据库备份和恢复到同步状态?

我需要备份 10-20 个大小在 10-50 GB 之间的 SQL Server 2008 R2 数据库,同时它们在线并由单个企业应用程序同时使用。我还需要将它们恢复到在所有数据库之间基本同步的状态(我可以承受数据库之间长达几秒钟的不同步)。目的是为 QA​​/DEV 环境捕获生产数据。

我强烈希望不要求数据库在完全恢复中运行,并提出一种备份方法,该方法专用于为 QA 环境捕获数据,并保持独立于不受我控制的主备份过程。

对于我的客户,捕获 20 个完整备份(每个约 30 GB)需要 1-2 小时。这使得按顺序进行完整备份是不可接受的,因为在简单恢复中运行时数据库会过于不同步。

我正在寻找比这些更好的想法:

想法 1:虚拟机磁盘的 SAN 级快照。从快照 xcopy MDF/LDF。

一旦复制的文件附加到不同的服务器实例,其恢复过程应该生成几乎同时快照的一致数据库。
谷歌搜索使我确信这是一个坏主意,至少因为我可能会与 master/msdb/etc 不同步。

IDEA 2:在所有数据库中编排复杂的备份和同步还原

这要求我要求以完全恢复运行的数据库,这是我不想要的。在截止日期 (T0) 之前为所有数据库启动并行备份。到达 T0 后,备份所有日志(最多需要几分钟)。获取由此产生的无数备份并尝试恢复它们并向前/向后滚动日志,以获得相对于 T0 的跨数据库某种程度的一致状态。
这需要大量的计划和脚本才能可靠地使用它,所以我会竭尽全力避免它。

我是否缺少其他解决方案?

PS1:我希望能够使用db snapshots。这个想法是在每个数据库上启动一个快照(应该在几秒钟内结束),然后在接下来的几分钟/几小时内按顺序完全备份每个。然后在不同的服务器上恢复所有这些并将每个恢复到快照。AFAIK 这种情况是不可能的,因为快照不能与数据库一起备份。它们只能在创建它们的服务器上就地回滚。此外,他们需要企业版,我没有为所有客户提供。

PS2:如果您知道能够生成跨数据库同步备份的 3rd 方解决方案,请提及它。

sql-server-2008 sql-server backup snapshot restore

15
推荐指数
2
解决办法
2295
查看次数

大量插入阻止选择

我遇到了大量阻止我的 SELECT 操作的 INSERT 的问题。

架构

我有一张这样的表:

CREATE TABLE [InverterData](
    [InverterID] [bigint] NOT NULL,
    [TimeStamp] [datetime] NOT NULL,    
    [ValueA] [decimal](18, 2) NULL,
    [ValueB] [decimal](18, 2) NULL
    CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED 
    (
        [TimeStamp] DESC,
        [InverterID] ASC
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF
    , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON
    , ALLOW_PAGE_LOCKS = ON)
)
Run Code Online (Sandbox Code Playgroud)

我还有这个小助手程序,它允许我使用 MERGE 命令插入或更新(冲突时更新):

CREATE PROCEDURE [InsertOrUpdateInverterData]
    @InverterID bigint, @TimeStamp datetime
    , @ValueA decimal(18,2), @ValueB decimal(18,2)
AS
BEGIN
    MERGE [InverterData] AS TARGET
        USING (VALUES (@InverterID, …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server locking

15
推荐指数
1
解决办法
3720
查看次数

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C) 不使用 (A,B,C) 上的索引

考虑这两个函数:

ROW_NUMBER() OVER (PARTITION BY A,B ORDER BY C)

ROW_NUMBER() OVER (PARTITION BY B,A ORDER BY C)
Run Code Online (Sandbox Code Playgroud)

据我了解,它们产生完全相同的结果。换句话说,您在PARTITION BY子句中列出列的顺序无关紧要。

如果有一个索引,(A,B,C)我希望优化器在两个变体中都使用这个索引。

但是,令人惊讶的是,优化器决定在第二个变体中进行额外的显式排序。

我在 SQL Server 2008 Standard 和 SQL Server 2014 Express 上见过它。

这是我用来重现它的完整脚本。

在 Microsoft SQL Server 2014 上试用 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation Express Edition(64 位),Windows NT 6.1(内部版本 7601:Service Pack 1)

和 Microsoft SQL Server 2014 (SP1-CU7) (KB3162659) - 12.0.4459.0 (X64) 2016 年 5 月 27 …

sql-server-2008 sql-server sql-server-2014

15
推荐指数
1
解决办法
9416
查看次数