标签: sql-server

T-SQL 中的 Theil-Sen 估计器函数

有人有用 T-SQL 编写的Theil-Sen 回归函数吗?

找到了一个用 Perl 编写的,但我无法将其重新编码为 SQL。

sql-server functions

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

'Id' 格式为:YYYYNNNNNN,NNNNNN 部分每年重新开始

我有一个业务需求,即发票表中的每条记录都有一个看起来像 YYYYNNNNNN 的 ID。

NNNNNN 部分需要在每年年初重新启动。所以 2016 年输入的第一行看起来像 2016000001,第二行看起来像 2016000002 等等。假设 2016 年的最后一条记录是 2016123456,下一行(2017 年)应该看起来像 2017000001

我不需要这个 id 作为主键,我也存储创建日期。这个想法是这个'显示ID'是独一无二的(所以我可以通过它查询)并且可以按年份进行分组。

不太可能删除任何记录;但是,我倾向于防御性地编写代码以防止类似的事情。

有什么方法可以创建这个 id 而不必在每次插入新行时查询今年的最大 id?

想法:

  • A CreateNewInvoiceSP,它获取MAX那一年的值(令人讨厌)
  • 一些神奇的内置功能可以做到这一点(我可以做梦)
  • 能够在IDENTITYorDEFAULT声明中指定一些 UDF 或其他内容(??)
  • 使用的视图PARTITION OVER + ROW()(删除会出现问题)
  • 一个触发器INSERT(仍然需要运行一些MAX查询:()
  • 一年一度的后台工作,更新了一张表格,其中插入了每年的 MAX,然后我......什么?!

所有这些都有些不理想。欢迎任何想法或变化!

sql-server t-sql

11
推荐指数
2
解决办法
4694
查看次数

如何修复 MS SQL Server 上混乱的复制

我从备份中恢复了一个数据库。数据库使用复制发布到不同的服务器。假设数据库还原会破坏复制,我尝试删除复制并重新创建它(我们有一个脚本可以从头开始重新创建它)。我不确定我到底做了什么,但现在它处于完全混乱的状态,我无法修复它。

首先,我尝试取消订阅(在发布服务器上):

EXEC sp_dropsubscription @publication = 'PublicationName', @article = N'all', @subscriber = 'SubscriberServerName'
Run Code Online (Sandbox Code Playgroud)

这似乎有效。SELECT * FROM syssubscriptions显示没有结果。查看订阅服务器,SSMS > {SubscriberServer} > Replication > Local Subscriptions - 订阅不在那里。

然后我尝试删除该出版物。SSMS > {Server} > 复制 > 本地发布 > {PublicationName} > 删除。这给出了以下错误消息:

Could not delete publication 'PublicationName'.
Could not drop article. A subscription exists on it.
Changed database context to 'DatabaseName'. (Microsoft SQL Server, Error: 14046)
Run Code Online (Sandbox Code Playgroud)

好的,所以我尝试删除这些文章:

EXEC sp_droparticle @publication = 'PublicationName', @article = N'all'
Run Code Online (Sandbox Code Playgroud)

并收到此错误:

Invalidated the existing snapshot of the publication. …
Run Code Online (Sandbox Code Playgroud)

replication sql-server sql-server-2012 troubleshooting transactional-replication

11
推荐指数
2
解决办法
6万
查看次数

使用 CEILING 时 CASE 表达式返回错误值

我遇到了一个问题,即CASE表达式没有返回我期望的内容。

作为测试,我添加了一个十进制变量并CASE针对它运行了相同的表达式,它运行良好,返回了我预期的结果(在 时将值向上舍入IsGun=1。但是当我CASE针对另一个十进制值运行相同的表达式时,它总是返回CEILING()函数的值,从不返回原始值。

这是SQL代码:

DECLARE @Num decimal(8,2);
    set @Num = 12.54;
    WITH PQ AS
    ( 
        SELECT 
            UPC, 
            Price1, 
            DBID,
            AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg
        FROM
            vProducts_PriceQty_Union
    )
    SELECT 
        PQ.UPC,
        PQ.Price1,
        PQ.Price1Avg,
        (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar,
        CAST(
            (CASE WHEN P.IsGun = 1 THEN CEILING(PQ.Price1Avg) ELSE PQ.Price1 END)
             AS NUMERIC(8,2))
        AS PriceAdj,
        PQ.DBID,
        P.IsGun
    FROM
        PQ
     INNER JOIN
        products P …
Run Code Online (Sandbox Code Playgroud)

sql-server datatypes t-sql type-conversion

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

当sql server触发器失败时,我们可以提交事务吗?

当表上的插入触发器失败时,我试图避免数据丢失。我正在使用以下场景尝试此操作,但我的代码失败了。

当在客户表上发生插入时,我想将相同的数据插入到存档表中。当触发器失败时,我不想回滚整个事务,这会导致客户表上的数据丢失。

即使触发器失败,我也希望将数据插入到Customers表中,并且存储过程应该像往常一样返回Customer_ID

ALTER TRIGGER [dbo].[Customer_Insert_Trigger_Test] 
   ON  [dbo].[Customers]
   AFTER INSERT
AS 
BEGIN

BEGIN TRY
    begin transaction;
    set nocount  on;
    SAVE TRANSACTION InsertSaveHere;
    --Simulating error situation
    RAISERROR (N'This is message %s %d.', -- Message text.
       11, -- Severity,
       1, -- State,
       N'number', -- First argument.
       5); -- Second argument.

   Insert into Archive select * from Inserted;
    commit transaction;

  END TRY

  BEGIN CATCH
    ROLLBACK TRANSACTION InsertSaveHere;
  END CATCH
END
Run Code Online (Sandbox Code Playgroud)

我的问题主要是关于如何避免在客户表上的实际插入以在触发器失败时回滚。如何更改我的代码?

trigger sql-server transaction

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

为什么将 Auto Update Statistics 设置为 False?

作为更广泛的收购项目的一部分,我刚刚继承了大约 20 个 SQL Server 实例。我正在评估性能,我不喜欢维护计划的实施方式。

我每天都在看到全面的索引重建(我可以处理这个)以及每天手动更新统计数据。

大约一半的数据库已设置为 Auto Update Statistics = False,原因尚不清楚,除了我被告知是为了减少“性能问题”...

我一直认为并致力于将其设置为 True 的最佳实践,并认为如果此设置为 True,则不需要手动更新。我错了吗?

任何人都可以解释将此设置为 False 的好处是什么,而是每天进行手动更新?

我应该提到一些数据库是高度事务性的(每天数百万次插入、删除、更新),其他数据库在事务率方面很低,有些几乎是只读的。虽然没有押韵或理由将自动更新设置设置为 False。好像是彩票。

performance sql-server statistics index-statistics

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

如何降低 SQL Server 中的 HEAP 碎片?

我最近发现一个堆表有超过 70% 的碎片。所以我决定做一个

ALTER TABLE dbo.myTable REBUILD
Run Code Online (Sandbox Code Playgroud)

有趣的是,之后我有 20% 的碎片。从那以后,那张桌子上再也没有写过。所以我决定再做一次重建。

第2次后桌帽50%碎片化就更厉害了! 我真的不明白这怎么会发生......

sql-server heap fragmentation

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

奇数流聚合行为

询问:

declare @X xml = '
<item ID = "0"/>
<item ID = "1"/>
<item/>
<item/>';

select I.X.value('@ID', 'int')
from @X.nodes('/item') as I(X);
Run Code Online (Sandbox Code Playgroud)

结果:

-----------
0
1
NULL
NULL
Run Code Online (Sandbox Code Playgroud)

执行计划:

在此处输入图片说明

顶部分支将 XML 分解为四行,底部分支获取属性的值ID

令我感到奇怪的是从 Stream Aggregate 运算符返回的行数。来自过滤器的 2 行是来自XML 中ID第一个和第二个item节点的属性。流聚合返回四行,每个输入行一行,有效地将内连接转换为外连接。

这是 Stream Aggregate 在其他情况下也会做的事情,还是在进行 XML 查询时只是发生了一些奇怪的事情?

我在查询计划的 XML 版本中看不到任何提示,表明此 Stream Aggregate 的行为应该与我之前注意到的任何其他 Stream Aggregate 有所不同。

sql-server execution-plan

11
推荐指数
2
解决办法
1010
查看次数

当有很多用户时,DROP USER 花费的时间太长

在具有足够 RAM 和快速磁盘的 SQL Server 2014 实例上,有 160 多个用户可以访问数据库。出于某种我不知道的原因,DROP USER [username]在这个数据库中运行命令每个用户最多需要 5 秒。

将用户重新映射到登录并恢复他们的权限非常快。

在从生产中刷新 DEV 数据库的上下文中,我必须删除并重新创建所有数据库用户。所以是的,删除数据库用户并重新创建它们是必要的。

如何加速DROP USER命令?

请记住,对于我正在编写的实例,我必须运行它超过 160 次。

这是我正在使用的 SQL:

DECLARE drop_user_cur CURSOR FOR 
SELECT name FROM #drop_users

OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
    BEGIN TRY
        print @sql
        EXECUTE(@sql)
    END TRY
    BEGIN CATCH
        print 'ERREUR : ' + @sql …
Run Code Online (Sandbox Code Playgroud)

security sql-server

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

在这种情况下将使用哪个索引?

SQL Server 2014 标准版

我需要找到特定月份往返特定城市的航班数量。例如

select count(*) 
from flights 
where flightTo_AirportCode = 'aaaa' 
and flightFrom_Airportcode = 'bbbb' 
and flightdate < '2016-04-01' 
and flightdate > '2016-02-28' ;
Run Code Online (Sandbox Code Playgroud)

表架构如下。

我试图估计索引模型 A 或索引模型 B(如下)是否更可取(构建索引需要很多小时,并且磁盘空间一次只允许一个存在,所以我试图在跳跃之前查看)。

根据我的经验,任何一个索引都可以。我对吗?

  create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate)

  create index [modelB] on flights (flightDate, flightTo_AirportCode, flightFrom_AirportCode)
Run Code Online (Sandbox Code Playgroud)

(或者,更好的是,我可以使用二进制索引或高级机制来解决这个问题吗?)

CREATE TABLE [dbo].[flights](
    [flightId] [uniqueidentifier] NOT NULL,
    [accountId] [uniqueidentifier] NULL,
    [flightDate] [datetime] NULL,
    [flightTo_AirportCode] [nvarchar](30) NULL,
    [flightFrom_AirportCode] [nvarchar](30) NULL,
    -- ... 45 more fields
    CONSTRAINT [PK_flight] PRIMARY KEY CLUSTERED 
(
    [flightId] …
Run Code Online (Sandbox Code Playgroud)

sql-server index-tuning sql-server-2014

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