如果我想保存表中的任何更改,以前保存在SQL Server Management Studio中(表中没有数据),我收到一条错误消息:
不允许保存更改.您所做的更改需要删除并重新创建以下表.您已对无法重新创建的表进行了更改,或者启用了"禁止保存需要重新创建表的更改"选项.
什么可以防止表格被轻易编辑?或者,这是SQL Server Management Studio要求重新创建表进行编辑的常用方法吗?它是什么 - 这个"选项防止保存更改"?
使用TSQL检查SQL Server上是否存在数据库的理想方法是什么?似乎有多种方法可以实现这一点.
我有这个sql:
ALTER TABLE dbo.ChannelPlayerSkins
DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
Run Code Online (Sandbox Code Playgroud)
但显然,在我们使用的其他一些数据库中,约束具有不同的名称.如何检查名称是否存在约束FK_ChannelPlayerSkins_Channels.
使用SQL Server,我有......
ID SKU PRODUCT
=======================
1 FOO-23 Orange
2 BAR-23 Orange
3 FOO-24 Apple
4 FOO-25 Orange
Run Code Online (Sandbox Code Playgroud)
我想要
1 FOO-23 Orange
3 FOO-24 Apple
Run Code Online (Sandbox Code Playgroud)
这个问题不是让我在那里.如何在一列上选择DISTINCT?
SELECT
[ID],[SKU],[PRODUCT]
FROM [TestData]
WHERE ([PRODUCT] =
(SELECT DISTINCT [PRODUCT] FROM [TestData] WHERE ([SKU] LIKE 'FOO-%'))
ORDER BY [ID]
Run Code Online (Sandbox Code Playgroud) 我已经为9个表创建了使用INNER JOIN的SQL命令,无论如何这个命令需要很长时间(超过五分钟).因此,我的民众建议我将INNER JOIN更改为LEFT JOIN因为LEFT JOIN的表现更好,尽管我所知道的第一次.我改变后,查询的速度显着提高.
我想知道为什么LEFT JOIN比INNER JOIN快?
我的SQL命令如下所示:
SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D依此类推
更新: 这是我的架构的简要说明.
FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
ON a.CompanyCd = b.CompanyCd
AND a.SPRNo = b.SPRNo
AND a.SuffixNo = b.SuffixNo
AND a.dnno = b.dnno
INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine
ON a.CompanyCd …Run Code Online (Sandbox Code Playgroud) 查询运行速度很快:
DECLARE @SessionGUID uniqueidentifier
SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908'
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
Run Code Online (Sandbox Code Playgroud)
子树成本:0.502
但是将相同的SQL放在存储过程中运行速度很慢,并且执行计划完全不同
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
EXECUTE ViewOpener @SessionGUID
Run Code Online (Sandbox Code Playgroud)
子树成本:19.2
我跑了
sp_recompile ViewOpener
Run Code Online (Sandbox Code Playgroud)
它仍然运行相同(严重),我也已将存储过程更改为
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *, 'recompile please'
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
Run Code Online (Sandbox Code Playgroud)
然后再回来,试图真正欺骗它重新编译.
我已经删除并重新创建存储过程以使其生成新计划.
我尝试使用一个诱饵变量强制重新编译,并防止参数嗅探:
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
DECLARE …Run Code Online (Sandbox Code Playgroud) 在设计表时,我养成了一个习惯,就是让一个列是唯一的,并且我制作了主键.这取决于要求以三种方式实现:
数字3将用于相当小的查找,主要是可能具有唯一静态长度字符串代码的读取表,或者诸如年份或其他数字的数字值.
在大多数情况下,所有其他表将具有自动递增整数或唯一标识符主键.
我最近开始使用没有一致行标识符的数据库,主键目前在各个列上进行聚类.一些例子:
这有一个有效的案例吗?我总是会为这些案例定义一个标识或唯一标识符列.
此外,还有许多表没有主键.这有什么正当理由?
我试图理解为什么桌子的设计原样,对我来说这似乎是一个很大的混乱,但也许有充分的理由.
第三个问题可以帮助我解释答案:在使用多列构成复合主键的情况下,这种方法与代理/人工密钥相比有特定的优势吗?我主要考虑的是性能,维护,管理等方面?
我从SQL Server数据库中的表中删除了一些记录.现在ID从101到1200.我想再次删除记录,但我希望ID能够回到102.有没有办法在SQL Server中执行此操作?
当我在SQL中选择日期时,它将返回为 2011-02-25 21:17:33.933.但我只需要Date部分2011-02-25.我怎样才能做到这一点?
sql-server ×10
sql ×5
database ×2
performance ×2
t-sql ×2
delete-row ×1
distinct ×1
relational ×1
ssms ×1