标签: sql-server-2016

如何在系统版本的时态表中保留修饰符ID?

我在sql server 2016中有一个系统版本的表.我想在用户对表执行删除更新操作时在其时态(历史)表中存储修饰符ID .

sql server 2016 有没有内置的解决方案呢?

sql-server temporal sql-server-2016

7
推荐指数
1
解决办法
279
查看次数


使用FOR JSON子句获取多行

使用PostgreSQL我可以拥有多行json对象.

select (select ROW_TO_JSON(_) from (select c.name, c.age) as _) as jsonresult from employee as c
Run Code Online (Sandbox Code Playgroud)

这给了我这个结果:

{"age":65,"name":"NAME"}
{"age":21,"name":"SURNAME"}
Run Code Online (Sandbox Code Playgroud)

但是在SqlServer中,当我使用FOR JSON AUTO子句时,它为我提供了一个json对象数组,而不是多行.

select c.name, c.age from customer c FOR JSON AUTO

[{"age":65,"name":"NAME"},{"age":21,"name":"SURNAME"}]
Run Code Online (Sandbox Code Playgroud)

如何在SqlServer中获得相同的结果格式?

sql-server sql-server-2016

7
推荐指数
2
解决办法
8045
查看次数

时态表中的日期函数

从 SQL Server 2016 开始,可以自动创建时态表。我想创建一个简单的查询来检索指定日期的数据。但是,当我尝试像这样在查询中指定日期时,它会出现语法错误:

SELECT * FROM Person FOR SYSTEM_TIME AS OF GETDATE()
Run Code Online (Sandbox Code Playgroud)

我什至尝试将数据类型转换为 datetime2,因为日期是这样存储的,但它仍然不起作用:

SELECT * FROM Person FOR SYSTEM_TIME AS OF CONVERT(datetime2,GETDATE())
Run Code Online (Sandbox Code Playgroud)

出现此问题,但是当我第一次执行SELECT GETDATE()然后复制文本并将其粘贴到查询中时,它工作正常。如何使用 AS OF 关键字指定日期时间?

提前致谢。

sql t-sql sql-server-2016 temporal-tables

7
推荐指数
1
解决办法
1750
查看次数

UPDLOCK和HOLDLOCK查询没有创建预期的锁

我有下表:

CREATE TABLE [dbo].[table1](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](50) NULL,
 CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

我正在学习SQL锁是如何工作的,我正在尝试测试一种情况,我想锁定一行不被读取和更新.从这篇文章开始,这个任务的一些灵感,这是我试图解决的原始问题.

当我运行这个T-SQL时:

BEGIN TRANSACTION

SELECT * FROM dbo.table1 WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:15'

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我希望在表上放置一个独占锁,特别是对于行(如果我在主键上有一个WHERE语句)

但运行此查询,我可以看到GRANTed LOCK用于请求模式IX.

SELECT * FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID() AND resource_associated_entity_id = OBJECT_ID(N'dbo.table1');
Run Code Online (Sandbox Code Playgroud)

此外,在单独的SSMS窗口中,我可以在事务运行时完全查询表.

为什么MSSQL不尊重锁定提示?

(SQL …

database sql-server sql-server-2016

7
推荐指数
2
解决办法
667
查看次数

SQL将重复记录合并到一行

我有一个SQL Server 2016数据库,里面有几千条记录.

目前显示的记录是这样的;

在此输入图像描述

我希望得到这个结果;

在此输入图像描述

然后我将数据导出到Excel.

基本上有一个人和多个帐户类型的多个联系人详细信息,而不是每个细节占用一个新行,我需要将它们全部折叠到一行添加列,我可以创建一个新的数据库,如果插入了列,需要.

我试过这些解决方案的变化;

由塔伦

哈桑 - 我无法弄清楚我需要加入什么以及在哪里.

作者:Brad C - 我在这个数据库中截断了表格,因此取得了一些成功.

还有其他几个,但链接已被埋葬,我很抱歉.

架构

CREATE TABLE [dbo].[Contacts] 
(
    [emplid] [float] NULL,
    [emcoid] [float] NULL,
    [name] [varchar](50) NULL,
    [conttp] [varchar](50) NULL,
    [phone] [varchar](50) NULL,
    [fax] [varchar](50) NULL,
    [email] [varchar](50) NULL,
    [auth] [float] NULL,
    [ainits] [varchar](50) NULL,
    [adate] [datetime] NULL,
    [atime] [datetime] NULL,
    [uinits] [varchar](50) NULL,
    [udate] [datetime] NULL,
    [utime] [datetime] NULL
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

测试数据

INSERT [dbo].[Contacts_NEW] ([emplid], [emcoid], [name], [conttp], [phone], [fax], [email], [auth], [ainits], …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2016

7
推荐指数
1
解决办法
60
查看次数

T-SQL连续组合行

我有一个如下所示的表格.我想要的是彼此连续的行被组合在一起 - 对于每个"ID".列IsContinued标记下一行是否应与当前行组合

我的数据如下:

+-----+--------+-------------+-----------+----------+
| ID  | Period | IsContinued | StartDate | EndDate  |
+-----+--------+-------------+-----------+----------+
| 123 | 1      | 1           | 20180101  | 20180404 |
+-----+--------+-------------+-----------+----------+
| 123 | 2      | 1           | 20180501  | 20180910 |
+-----+--------+-------------+-----------+----------+
| 123 | 3      | 0           | 20181001  | 20181201 |
+-----+--------+-------------+-----------+----------+
| 123 | 4      | 1           | 20190105  | 20190228 |
+-----+--------+-------------+-----------+----------+
| 123 | 5      | 0           | 20190401  | 20190430 |
+-----+--------+-------------+-----------+----------+
| 456 | …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server-2016

7
推荐指数
1
解决办法
85
查看次数

如何将表转换为Json数组?

我正在使用Sql Server 2016,我想将表转换为json.

我有一个简单的表:

CREATE TABLE [dbo].[TableTmp](
    [Color] [nvarchar](50) NULL,
    [Type] [nvarchar](50) NULL,
    [Number] [nvarchar](50) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Blue', N'A', N'1')
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Blue', N'A', N'2')
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Blue', N'A', N'3')
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Blue', N'B', N'1')
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Blue', N'C', N'1')
GO
INSERT [dbo].[TableTmp] ([Color], [Type], [Number]) VALUES (N'Red', N'A', N'1')
GO …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server arrays json sql-server-2016

7
推荐指数
1
解决办法
349
查看次数

如何将报表服务器订阅 SQL 代理作业名称链接到其正在运行的报表的名称

在我的报表服务器数据库上,所有用户的报表订阅都保存为 SQL 代理作业,这是正常情况。

如果我连接到报表服务器数据库并列出 SQL 代理作业,我会看到一个以随机字符串命名的巨大作业列表,例如:

000D5787-8802-4CB1-9784-8897C596003F

通过反复试验的过程,我发现特定的代理作业与我的“每日销售”报告相关,并且我能够查看作业历史记录,将 SQL 命令添加到订阅运行的代码中,等等。

但是,我有数百份用户报告。我需要能够以某种方式将报告的名称与 SQL 代理作业的名称联系起来。要么让报表服务器更有效地命名其订阅作业,要么通过使用某种查找表,当我向下滚动作业列表时可以参考该表格。

有任何想法吗?我尝试查看 ReportServer 的“订阅”表,它确实有一些看起来相似的 ID 号,但它们都不与作业名称匹配。

sql-server reporting-services sql-server-2016

7
推荐指数
1
解决办法
9726
查看次数

SQL Server 从 JSON 中提取第一个数组元素

我将 json 存储在 SQL Server 中的一列中,我需要修改它以从中删除方括号。格式如下。似乎找不到一个好的方法来做到这一点。

[ { "Message":"Info: this is some message here.", "Active":true } ]
Run Code Online (Sandbox Code Playgroud)

一种方法是使用下面的查询来完成此操作,但是这个查询非常非常慢,而且我需要在非常大的数据集上运行。

select a.value
from dbo.testjson e
cross apply OPENJSON(e.jsontext) as a
where isjson(e.jsontext) = 1
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一其他方法就是进行字符串操作,但这可能很容易出错。有人可以帮忙解决这个问题吗?

sql-server-2016

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