我想创建一个与此类似的索引视图(稍微简化):
Create VIEW dbo._v1
WITH SCHEMABINDING
AS
SELECT
COUNT_BIG(*) as CB
,[ID]
,TITLE]
,dbo.getXmlTranslation1(acat.[TITLE], 'de-DE') as T
FROM dbo.[ArticleCategory] acat
Group by
[ID]
,[TITLE]
Run Code Online (Sandbox Code Playgroud)
在此上创建唯一聚集索引失败:
CREATE unique CLUSTERED INDEX __CLIX
ON dbo._v1([ID]);
Run Code Online (Sandbox Code Playgroud)
无法在视图“db._v1T”上创建聚集索引“__CLIX”,因为视图的选择列表包含聚合函数或分组列结果的表达式。考虑从选择列表中删除聚合函数或分组列结果的表达式。
我搜索了解决方案,但找不到。如果我删除 GROUP BY(我在这里真的不需要),我会被告知由于多个 [ID] 结果,无法创建唯一聚集索引。我添加了标量函数调用,以解决索引视图中不允许的 XML 操作。我检查了标量函数是否是确定性的,是什么情况。
我有以下查询。有没有一种方法可以将其放入一个查询中?如果没有,我可以进一步缩小它吗?请指教。
DECLARE @highRegion TABLE(regionId INT, countR INT)
DECLARE @lowRegion TABLE(regionId INT, countR INT)
DECLARE @midRegion TABLE(regionId INT, countR INT)
INSERT INTO @highRegion
SELECT c.fRegionID,
COUNT(1) AS VALUE
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name IN ('High income: nonOECD', 'High income: OECD')
GROUP BY
c.fRegionID
INSERT INTO @lowRegion
SELECT c.fRegionID AS VALUE,
COUNT(1)
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name = 'Upper middle income'
GROUP BY
c.fRegionID
INSERT INTO …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization sql-server-2012 query-performance
我支持使用 CodeSmith 和 NetTiers 模板生成 C# 代码的应用程序。CodeSmith 检查数据库并使用SET FMTONLY ON设置来确定应为其生成代码的列。
不幸的是,在从 SQL Server 2005 迁移到 2012 的过程中,在某些特定情况下,这不再起作用。有一个在链接服务器上执行存储过程的存储过程,并且为该存储过程生成的代码不正确。
我已经设法将问题EXEC与SET FMTONLY ON. 以下(仅示例)SELECT适用于 2005 和 2012 实例:
SET FMTONLY ON
SELECT TOP(10) [MCMCU]
,[MCSTYL]
,[MCDC]
FROM [JDE].[JDE_CRP].[CRPDTA].[F0006]
SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这仅返回列标题。以下仅适用于 2005 实例:
SET FMTONLY ON
EXEC('SELECT TOP(10) [MCMCU]
,[MCSTYL]
,[MCDC]
FROM [JDE_CRP].[CRPDTA].[F0006]') AT [JDE]
SET FMTONLY OFF
Run Code Online (Sandbox Code Playgroud)
在 2012 实例上运行时,SSMS 显示消息“命令成功完成”,但不显示列标题。
有什么我在这里想念的吗?也许是我需要更改的设置?链接服务器定义是相同的,包括用于连接的身份。是的,我知道这FMTONLY已被弃用,但我无法更改 CodeSmith 询问数据库的方式。
使用Select top 1语句我必须从没有任何唯一键的 8 列表中检索数据。现在我想将此表转换为两列:原始列名到第一列,其各自的值到第二列。
像这样的原始表:
Column1 | Column2 | Column3 | Column4
55 | 108 | 555 | 85
Run Code Online (Sandbox Code Playgroud)
和预期的结果:
ColumnName | Value
Column1 | 55
Column2 | 108
Column3 | 555
Column4 | 85
Run Code Online (Sandbox Code Playgroud) 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 查询。它似乎工作正常,除非我连接结果以制作实际语句。伪代码如下
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 2008 Management Studio。我.bak从客户那里得到了一个备份文件来解决一个特定的问题。
从.bak文件中恢复数据库后,我无法执行任何更改查询或更改主密钥。
在我的新数据库中,在客户端环境 DB 中创建的所有触发器都附加到它。所以得到以下错误。
消息 208,级别 16,状态 1,过程 dbtrg_DBEventsmodel,第 16 行
无效的对象名称“DBMonitor.dbo.ddl_DBEvents”。
有没有办法在恢复的数据库中分离这些触发器?
我有一个查询,即使使用SQL Sentry,也无法消除索引扫描。
这是查询:
SELECT TOP 30 codCliente FROM (
SELECT t1.CodCliente, codcampo, valor, t1.chavealeat
FROM tblCliente AS t1 WITH(NOLOCK)
INNER JOIN tblClienteDetalhe AS t2 WITH(NOLOCK)
ON t1.codcliente = t2.codcliente
AND CodCampo IN(-1, 4)
WHERE codStatus IN (0)
AND t1.ChavePeriodo < GETDATE()
AND t1.CodStatusLigacao = 0
AND EXISTS
(
SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK)
WHERE codcampo = 3 AND valor = '2'
AND codcliente = t1.codcliente
)
AND EXISTS
(
SELECT codcliente FROM tblclientedetalhe WITH(NOLOCK)
WHERE codcampo = 6
AND CONVERT(DATETIME, …Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 sql-server clustered-index query-performance
我已经安装了 Microsoft SQL Server 2014 Management Studio,并且已经在数据库上工作了一段时间。我的笔记本电脑安装了 Windows 7(64 位)。我一直在那台机器上进行定期备份,并将备份存储在外部驱动器上。
由于某种原因,我的笔记本电脑停止工作。所以现在我开始在另一台笔记本电脑上工作。另一台笔记本电脑上安装了 Windows 7(32 位)。我安装了 Microsoft SQL Sever 2014 Management Studio 并使用该.bak文件恢复了我的数据库。
我已经在这个数据库上工作了一段时间,现在问题是当我尝试备份我的数据库时,我收到这个错误:
有人可以告诉我如何解决此错误以及如何再次在这台 Windows 32 位笔记本电脑上进行备份吗?
谢谢
这是 MSDN 页面上 OVER 子句的一段代码:
USE AdventureWorks2012;
GO
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;
Run Code Online (Sandbox Code Playgroud)
所以我在理解为什么必须在那里使用 CONVERT 函数时遇到问题。我认为这与转换函数的表达式部分中的字段之一的返回类型有关?可以用 CAST 代替吗?我的第二个问题是,这部分究竟是如何工作的?
SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
Run Code Online (Sandbox Code Playgroud)
这到底是什么意思?是每年计算总和吗?是这样吗?