我想删除数据库中所有表的所有约束,因为我需要更改许多表的关系。
有没有办法用 T-SQL 做到这一点?我找不到任何解决方案和代码,例如:
ALTER TABLE testDB.dbo.testTable1
DROP ALL CONSTRAINT
GO
Run Code Online (Sandbox Code Playgroud)
不起作用。
设置:
假设我们有一个处于完全恢复模式的数据库,它执行夜间数据库备份、事务日志备份和事务日志收缩。
现在事务日志在白天增长如此之快,因此我们需要每6小时执行一次事务日志备份+事务日志收缩以保持其较小。
问题:
鉴于这些事件序列(特别是每六小时的事务日志备份/收缩),我们是否仍然能够执行“最新”恢复?(即使用上次 DB Backup + Transaction Log 获取最新数据)。
在过去,我见过使用诸如
SELECT ISNULL(NULLIF(Field1, ''), 'NewValue')
简洁地获得回退值。
然而,自从 TSQL 中出现 CASE 以来,我们更喜欢一些类似的东西
SELECT CASE Field1 WHEN '' THEN 'NewValue' ELSE Field1 END
一个会比另一个表现更好吗?选择一个而不是另一个的其他原因是什么?
这个问题是在工作中的讨论中提出的……给定以下 T-SQL 语句:
select firstname, lastname from users order by lastname;
Run Code Online (Sandbox Code Playgroud)
order by子句的默认排序顺序是asc。
SQL Server 中是否有允许您更改ASC|DESC未指定修饰符时使用的默认顺序的设置?
这个问题的背景可以在这里找到。
我的存储过程的以下部分不起作用。条款是否有字符长度限制LIKE?t1.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
给出以下代码:
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) 如果我这样做——
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]降序排列的单个“顶部”相关记录?
作为这个问题的后续,我想知道是否有更好和/或更有效的方法来收集相关数据。
如前所述,这个查询确实返回了我需要的 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) 我有以下查询
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
我最近继承了一个包含大量存储过程的代码库。他们支持的系统遇到了许多我正在研究的性能问题。
许多存储过程都有这样的模式:
建立动态 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)执行这个动态sql
EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)从临时表中选择并带入一堆附加信息以返回给客户端。
SELECT
...
FROM
@tempTable
INNER JOIN ...
Run Code Online (Sandbox Code Playgroud)我的即时想法是:
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
t-sql ×10
sql-server ×9
performance ×2
alter-table ×1
constraint ×1
index ×1
index-tuning ×1
locking ×1
restore ×1
select ×1
ssms ×1
subquery ×1