标签: sql-server

由于聚合,索引视图上的唯一聚集索引失败

我想创建一个与此类似的索引视图(稍微简化):

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 操作。我检查了标量函数是否是确定性的,是什么情况。

index sql-server materialized-view

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

有没有办法可以将以下查询缩短为单个查询?

我有以下查询。有没有一种方法可以将其放入一个查询中?如果没有,我可以进一步缩小它吗?请指教。

    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

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

SQL Server 2012 中的 FMTONLY 问题

我支持使用 CodeSmith 和 NetTiers 模板生成 C# 代码的应用程序。CodeSmith 检查数据库并使用SET FMTONLY ON设置来确定应为其生成代码的列。

不幸的是,在从 SQL Server 2005 迁移到 2012 的过程中,在某些特定情况下,这不再起作用。有一个在链接服务器上执行存储过程的存储过程,并且为该存储过程生成的代码不正确。

我已经设法将问题EXECSET 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 询问数据库的方式。

sql-server linked-server sql-server-2012

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

在sql中将多列转换为2列并将单行转换为多行

使用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 sql-server-2008-r2

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

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
查看次数

如何从 SQL Server 中还原的数据库中删除触发器

我正在使用 SQL Server 2008 Management Studio。我.bak从客户那里得到了一个备份文件来解决一个特定的问题。

.bak文件中恢复数据库后,我无法执行任何更改查询或更改主密钥。

在我的新数据库中,在客户端环境 DB 中创建的所有触发器都附加到它。所以得到以下错误。

消息 208,级别 16,状态 1,过程 dbtrg_DBEventsmodel,第 16 行
无效的对象名称“DBMonitor.dbo.ddl_DBEvents”。

有没有办法在恢复的数据库中分离这些触发器?

trigger sql-server restore

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

无法消除索引扫描

我有一个查询,即使使用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

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

SQL Server 2014 Management Studio 备份错误

我已经安装了 Microsoft SQL Server 2014 Management Studio,并且已经在数据库上工作了一段时间。我的笔记本电脑安装了 Windows 7(64 位)。我一直在那台机器上进行定期备份,并将备份存储在外部驱动器上。

由于某种原因,我的笔记本电脑停止工作。所以现在我开始在另一台笔记本电脑上工作。另一台笔记本电脑上安装了 Windows 7(32 位)。我安装了 Microsoft SQL Sever 2014 Management Studio 并使用该.bak文件恢复了我的数据库。

我已经在这个数据库上工作了一段时间,现在问题是当我尝试备份我的数据库时,我收到这个错误:

SQLServer 错误

有人可以告诉我如何解决此错误以及如何再次在这台 Windows 32 位笔记本电脑上进行备份吗?

谢谢

sql-server

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

为什么在此语句中使用 Convert,它与 CAST 有何不同?

这是 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)

这到底是什么意思?是每年计算总和吗?是这样吗?

sql-server-2008 sql-server

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