标签: t-sql

SQL Server:如何在 T-SQL 中删除表上的所有约束

我想删除数据库中所有表的所有约束,因为我需要更改许多表的关系。

有没有办法用 T-SQL 做到这一点?我找不到任何解决方案和代码,例如:

ALTER TABLE testDB.dbo.testTable1
DROP ALL CONSTRAINT
GO
Run Code Online (Sandbox Code Playgroud)

不起作用。

constraint t-sql sql-server-2008-r2 alter-table

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

我们可以在进行事务日志备份后执行“最新恢复”吗?

设置:

假设我们有一个处于完全恢复模式的数据库,它执行夜间数据库备份、事务日志备份和事务日志收缩。

现在事务日志在白天增长如此之快,因此我们需要每6小时执行一次事务日志备份+事务日志收缩以保持其较小。

问题:

鉴于这些事件序列(特别是每六小时的事务日志备份/收缩),我们是否仍然能够执行“最新”恢复?(即使用上次 DB Backup + Transaction Log 获取最新数据)。

sql-server ssms t-sql restore transaction-log

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

使用或不使用 ISNULL(NULLIF(Field1, ''))?

在过去,我见过使用诸如

SELECT ISNULL(NULLIF(Field1, ''), 'NewValue')

简洁地获得回退值。

然而,自从 TSQL 中出现 CASE 以来,我们更喜欢一些类似的东西

SELECT CASE Field1 WHEN '' THEN 'NewValue' ELSE Field1 END

一个会比另一个表现更好吗?选择一个而不是另一个的其他原因是什么?

sql-server t-sql

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

在 SQL Server 中是否可以将默认的“order by”方向从 asc 更改为 desc?

这个问题是在工作中的讨论中提出的……给定以下 T-SQL 语句:

select firstname, lastname from users order by lastname;
Run Code Online (Sandbox Code Playgroud)

order by子句的默认排序顺序是asc

SQL Server 中是否有允许您更改ASC|DESC未指定修饰符时使用的默认顺序的设置?

sql-server t-sql

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

LIKE 字符长度限制

这个问题的背景可以在这里找到

我的存储过程的以下部分不起作用。条款是否有字符长度限制LIKEt1.ProductList有时最长可达 1000 个字符:

DELETE t1 FROM #tmptable t1
WHERE EXISTS (SELECT 1 FROM #tmptable2_ t2
              WHERE t1.DealerId != t2.DealerId
              AND t2.ProductList LIKE '%' + t1.ProductList + '%'
              AND t2.numberOfVibs > t1.numberOfVibs);
Run Code Online (Sandbox Code Playgroud)

列中单行的示例数据ProductList

B1ZMA25706,B1ZMI09502,B1ZMI12910,B1ZMI18602,BB001TBL26,BBHMOVE4,BE09501FBL,BGS52200,BKS3003,BM2,BO11001EBO,BPGTB1200,BPGTC172HP,BPGTX663,BPIVMS6502,BPIVOD1022,BPVA475,BPVB1000,BPVB800,BPVC652,BPVPW1500,BPVW1000,BPVX652,BPVX662,BREMEN78, BSA2602、BSD2880、BSG62082、BSG71800、BSG81623、BSG82422、BSG82480、BSGL32015、CAB150、CAB21、CD1401B、CD21001WAL、CD210012004CD500、CD21001、CD5000、CD2100400400000000000000000000000C

sql-server t-sql sql-server-2012

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

UPDLOCK 和 FOR UPDATE 的区别

给出以下代码:

Set conn = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
conn.BeginTrans
...
//This is the line it is about
RS.Open "SELECT a,b FROM c FOR UPDATE", conn, adOpenDynamic, adLockPessimistic
...
RS.Close
conn.CommitTrans
conn.Close
Run Code Online (Sandbox Code Playgroud)

我使用时有什么区别:

RS.Open "SELECT a,b FROM c (UPDLOCK)", conn, adOpenDynamic, adLockPessimistic
Run Code Online (Sandbox Code Playgroud)

更新:

现在我们使用 FOR UPDATE 但看起来表没有锁定。SQL Profiler 向我们展示了这一点:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

declare @p1 int  set @p1=NULL  declare @p3 int  set @p3=229378  declare @p4 int  set @p4=163842  declare @p5 int  set @p5=NULL  exec sp_cursoropen @p1 output,N'SELECT a,b FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql locking

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

为什么我需要使用子查询来过滤分组选择?

如果我这样做——

SELECT dv.Name
      ,MAX(hb.[DateEntered]) as DE
FROM 
    [Devices] as dv
    INNER JOIN 
    [Heartbeats] as hb ON hb.DeviceID = dv.ID
WHERE DE < '2013-03-04'
GROUP BY dv.Name
Run Code Online (Sandbox Code Playgroud)

我收到这个错误——

消息 207,级别 16,状态 1,第 17 行 列名“DE”无效。

如果我这样做——

SELECT Name, DE FROM (
    SELECT dv.Name
          ,MAX(hb.[DateEntered]) as DE
    FROM 
        [Devices] as dv
        INNER JOIN 
        [Heartbeats] as hb ON hb.DeviceID = dv.ID
    GROUP BY dv.Name
) as tmp WHERE tmp.DE < '2013-03-04'
Run Code Online (Sandbox Code Playgroud)

它按预期工作。

有人可以解释为什么我需要将主查询嵌套为子查询来限制我的数据集吗?

另外,这里是否有更好的方法来实现目标?从一张表中检索所有记录,以及按[DateEntered]降序排列的单个“顶部”相关记录?

sql-server-2008 sql-server t-sql subquery

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

需要一种方法来查询一个表,并将它与另一个表中的 TOP 1 相关记录连接起来

作为这个问题的后续,我想知道是否有更好和/或更有效的方法来收集相关数据。

如前所述,这个查询确实返回了我需要的 95% 的数据——

SELECT dv.Name
      ,MAX(hb.[DateEntered]) as DE
FROM 
    [Devices] as dv
    INNER JOIN 
    [Heartbeats] as hb ON hb.DeviceID = dv.ID
GROUP BY dv.Name
HAVING MAX(hb.[DateEntered]) < '20130304';
Run Code Online (Sandbox Code Playgroud)

有没有办法实现相同的结果(对于每个设备,选择由 DateEntered 排序的 TOP Heartbeat 的 DESC)而且还从表中选择整行[Heartbeats]?现在,我只得到那DateTime一行的。

如果我在GROUP BY子句中包含其他列,则可以将它们添加到选择中;但后来我每[Devices]行得到多行,这是我不想要的。这听起来很奇怪,但我基本上想要做的是对它进行查询[Devices],然后for...each对该集合进行查询并[Heartbeats]为该[Devices]行添加第一行。那可能吗?

更新 这是心跳表的结构:

CREATE TABLE [dbo].[Heartbeats](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DeviceID] [int] NOT NULL,
    [IsFMSFMPUp] [bit] NOT NULL,
    [IsFMSWebUp] [bit] NOT NULL,
    [IsPingUp] …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql select

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

覆盖索引问题

我有以下查询

Select  Pt.PRODID, PT.INVENTREFID,  Inv.ItemName, PT.ItemID, Configid,  Pt.QTYSCHED,
PT.DLVDATE,  Pt.CREATEDDATETIME, pt.SCHEDEND,
 CASE Left(PT.INVENTREFID, 3)
     WHEN 'SJB' THEN ST.SALESNAME
     WHEN 'WJB' THEN 'Sub - Assembly'
     ELSE 'Stock'
  END as CustomerName
from Dynamicsv5Realtime.dbo.PRODTABLE PT
Join Dynamicsv5Realtime.dbo.Inventdim ID
On PT.InventdimId = ID.InventdimID
and PT.Dataareaid = ID.dataareaid
Join Dynamicsv5Realtime.dbo.INVENTTABLE Inv
On Inv.itemid = PT.ItemId
Left Join Dynamicsv5Realtime.dbo.SALESTABLE ST
ON ST.SalesId = PT.INVENTREFID
and ST.Dataareaid = PT.dataareaid
where pt.PRODSTATUS in(2,3,4)
and PT.DATAAREAID = 'AJB'
Order by 7 
Run Code Online (Sandbox Code Playgroud)

当我想改进它时,我想出了以下索引

CREATE NONCLUSTERED INDEX [INDEX_2]
ON [dbo].[PRODTABLE] ([INVENTREFID],[DATAAREAID],[INVENTDIMID],[PRODSTATUS]) …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server t-sql index-tuning query-performance

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

如何证明以下 T-SQL 对性能不利?

我最近继承了一个包含大量存储过程的代码库。他们支持的系统遇到了许多我正在研究的性能问题。

许多存储过程都有这样的模式:

  1. 创建临时表
  2. 建立动态 SQL 查询以插入一堆记录,例如

    DECLARE @sql VARCHAR(MAX)
    SET @sql = 'INSERT INTO @tempTable
    SELECT SomeColumn, SomeColumn2, SomeColumn3, etc FROM MyTable'
    
    IF @someParam = [SomeValue]
        SET @sql = @sql + 'WHERE SomeColumn = [SomeValue]';
    
    IF @someOtherParam = [SomeOtherValue]
        SET @sql = @sql + 'WHERE SomeOtherColum = [SomeOtherValue]';
    
    Run Code Online (Sandbox Code Playgroud)
  3. 执行这个动态sql

    EXEC(@sql);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 从临时表中选择并带入一堆附加信息以返回给客户端。

    SELECT
    
       ...
    
    FROM
    
       @tempTable
       INNER JOIN ...
    
    Run Code Online (Sandbox Code Playgroud)

我的即时想法是:

  • 有动态 SQL,所以没有缓存计划,这意味着每次都会生成计划。
  • 有一个INSERT SELECT模式,所以表锁定更有可能是一个问题。

我用这种方式重写了一些存储过程:

    SELECT 

       ...

    FROM

        MyTable 
        INNER JOIN ...

    WHERE

    (
        @someParam != SomeValue
        OR
        SomeColumn …
Run Code Online (Sandbox Code Playgroud)

performance sql-server stored-procedures t-sql query-performance performance-tuning

4
推荐指数
2
解决办法
2479
查看次数