标签: t-sql

使用单个查询将数据添加到多个表

我想使用单个INSERT INTO查询将数据添加到多个表,我可以这样做吗?

如果可能,请指导我并提供语法。

sql-server-2008 sql-server t-sql

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

按 2 行结果排序会导致 800% 的性能下降

下面的查询,对一个大约 600 万行的表运行需要 25 秒。当我删除最终订单时,它会在 3 秒内运行。表上没有索引(它是一个中间 SSIS ETL 目标,后来被拉入 DW。)

它不是缓存。我以任何顺序多次运行它,结果一致。

查询本身会检查序列号中的差距。SSIS 将使用它来查看是否需要重新获取任何内容。

;with edges as
(
    select 
        ROW_NUMBER() over (partition by s1.SiteIDNumber order by s1.SequenceNumber) as rn,
        s1.SiteIDNumber, 
        s1.SequenceNumber
    from TestPlay s1
    left join TestPlay s2 on s2.SiteIDNumber = s1.SiteIDNumber and s2.SequenceNumber = s1.SequenceNumber + 1
    left join TestPlay s3 on s3.SiteIDNumber = s1.SiteIDNumber and s3.SequenceNumber = s1.SequenceNumber - 1
    where s2.SiteIDNumber is null 
    or s3.SiteIDNumber is null
),
gaps as
(
    select 
        e.rn,
        e.SiteIDNumber,
        e.SequenceNumber  + 1 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql sql-server-2012 gaps-and-islands

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

从 xml 列中提取整数值

我只是想知道如何从 XML 列中提取一个整数。目前所有的数字都是 4,下面的查询可以做到。但是这个数字很快就会增长到 10,000 个,这意味着 5 位数,这个查询将无法做到。无论如何,我是否可以动态地从 Xml 列的中间<siteID>和中间取出任何整数</siteID>。任何建议将不胜感激。

SELECT 
SUBSTRING(msg, patindex('%[0-9][0-9][0-9][0-9]</siteID>%',msg),4)  AS DOMAIN
FROM table  a(NOLOCK)
WHERE msg like '<DLR%'
ORDER BY 1 DESC
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql substring

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

分配新的自动增量值

我有一个创建如下的表。

CREATE TABLE [dbo].[Table1](
    [ID] [INT] IDENTITY(1,1) NOT NULL,
    [Title] [VARCHAR](255) NULL,
    ...
Run Code Online (Sandbox Code Playgroud)

假设最新的 ID 是 100(我有 100 条记录)

有没有办法到ALTER这个表的IDENTITY列并将自动增量值更改为现在 500?

所以最后我会得到这样的 ID 98, 99, 100, 500, 501, ....

我似乎无法在 T-SQL 中找到解决方案

sql-server auto-increment t-sql sql-server-2008-r2 identity

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

使用动态 SQL 定位行时出现问题

我一般是 SQL 新手,所以我在设计的一些存储过程中遇到了一些问题。我的程序接受 3 个参数。位置(或表名基本上是 varchar)、房间号 (varchar) 和 'xxx-xxxx' 形式的电话号码 (char)。这是该过程的代码。

ALTER PROCEDURE [dbo].[AddPhoneNumberToRoom]
    @Location    varchar(25),
    @Room        varchar(10),
    @PhoneNumber char(8)

AS
BEGIN
SET NOCOUNT ON;

    DECLARE @String varchar(100);
    SELECT @String = ' UPDATE ' + @Location + 
                     ' SET PhoneNumber = ' + @PhoneNumber +
                     ' WHERE Room = ' + @Room;
    EXEC(@String);
END
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

UPDATE 语句与 FOREIGN KEY 约束“FK_Apartments_PhoneNumbers”冲突。冲突发生在数据库“CMPhone”、表“dbo.PhoneNumbers”、列“PhoneNumber”中。

电话号码在 PhoneNumber 表中,所以当我这样做时:

UPDATE Apartments SET PhoneNumber='123-4567' WHERE Room='2'
Run Code Online (Sandbox Code Playgroud)

它工作得很好。该PhoneNumbers表还看起来是这样的,只是在它的一个数字。

PhoneNumber
-----------
123-4567
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures dynamic-sql t-sql

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

ALTER TABLE 上的 SQL Server lock_escalation 标志——我真的可以在没有表锁的情况下重组吗?

SQL Server 2014 标准版

在我的情况下,我有一个巨大的表(1 亿多行),并且需要:

  • 向其中添加列
  • 在该列中设置默认值

我在 https://technet.microsoft.com/en-us/library/ms190273(v=sql.110).aspx 中 看到有一个新的 lock_escalation 选项。

例如,这是否允许我在没有表锁的情况下执行以下操作:

例如

ALTER TABLE Protocols set (LOCK_ESCALATION = DISABLE);
go

ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
Run Code Online (Sandbox Code Playgroud)

然而,令人担忧的是:

a) LOCK_ESCALATION = DISABLE——它到底是干什么用的,它在这里适用吗?(SQL Server 文档有点薄……也许它只适用于分区表?)

b) LOCK_ESCALATION = DISABLE 是否影响事务大小?(看起来它仍然会创造一笔巨额交易?)

c) LOCK_ESCALATION = DISABLE 甚至会应用并避免表锁定吗?

d) 有没有办法把它分块?(无法想象,但在较新的 SQL 版本中有如此多的新魔法……我应该问一下!)

sql-server t-sql

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

在循环中动态创建查询

我正在遍历一个表,试图创建一个动态的 sql 查询。它似乎工作正常,除非我连接结果以制作实际语句。伪代码如下

WHILE (Data is in the table)
BEGIN
SELECT TOP 1 @result = result from table

@sql = @sql + ', ' + @result

END
Run Code Online (Sandbox Code Playgroud)

如果我查看@sql每个循环,我会看到预期的结果,但是当循环完成时@sql是空的。有人可以解释为什么吗?

sql-server t-sql sql-server-2012

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

简单地插入到临时表并失败

谁能告诉我为什么这对我不起作用?

CREATE TABLE #UndistributedCmds
(
pendingcmdcount int,
estimatedprocesstime INT
)
INSERT INTO #UndistributedCmds

EXEC sp_replmonitorsubscriptionpendingcmds ...
Run Code Online (Sandbox Code Playgroud)

错误:

消息 8164,级别 16,状态 1,过程 sp_replmonitorsubscriptionpendingcmds,第 152 行
INSERT EXEC 语句不能嵌套。

该错误似乎暗示存储过程定义的第 152 行是问题所在,但我无法理解这一点。这是因为存储过程本身有多个存储过程吗?

sql-server stored-procedures t-sql temporary-tables

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

使用 include 创建索引聚集 X NonClustered

我有一张像:

create table x (a varchar(20),
b varchar(30),
c varchar(30),
primary key clustered(a asc))
Run Code Online (Sandbox Code Playgroud)

所以我想知道我是否创建了一个像这样的索引:

Create nonclustered index test on x(a) include (b,c)
Run Code Online (Sandbox Code Playgroud)

该索引将使我使用列 a、b、c 的查询更快?

sql-server optimization t-sql index-tuning

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

在 SQL Server 中格式化电话号码

我正在使用 SQL Server 2008,我发现此解决方案仅适用于 SQL Server 2012 - 在 SQL Server 2008 中格式化电话号码的等效方法是什么?

FORMAT([PhoneField],'###-###-####')
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql

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