标签: t-sql

错误的估计行数

我正在尝试确定我有时在存储过程中遇到的问题。

我不得不说,存储过程在 select 子句中使用了 UDF(也许这就是问题的原因)但无论如何,不​​管它不是,下面是执行计划的一部分:

在此处输入图片说明

其中 Hash Match 的输出估计行数和非聚集索引 IX_Job_OperationID 上的 Index_Seek 估计值都是完全错误的:

在此处输入图片说明 在此处输入图片说明

我试图更新与索引 IX_Job_OperationID 相关的统计信息,即使使用 fullscan 选项,但它没有帮助。

UPDATE STATISTICS Job [IX_Job_OperationID] with fullscan
Run Code Online (Sandbox Code Playgroud)

我也在使用 recompile存储中选项,因为给定提供的参数,所涉及的数据集可能会发生很大变化。

有人能指出我正确的方向并帮助我理解为什么即使更新了统计数据,估计值与实际值相差甚远?

这里是实际执行计划的链接

该执行计划导致总共 8,610,665 次逻辑读取,而其他以某种方式选择的更好的计划可能约为 122,692

index sql-server statistics t-sql sql-server-2014

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

我应该为函数添加 set nocount 吗?

我一直在阅读有关所有触发器和过程的好处,除非您使用 DONE_IN_PROC,否则实现了“set nocount on”。

我有一个从更新触发器调用的标量值函数,用于计算多个表中的值的总和。

搜索 msdn 和过去的文章,我无法找到使用 set nocounton 的函数的明确示例。

包含或排除“set nocount on”对函数有什么影响?函数中是否有一点或代码异味应该表明添加了 set nocount on?

sql-server t-sql functions set-returning-functions

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

LEFT JOIN 产生夸大的 COUNT() 数字

我有 3 张表正在使用Right Join。数据设置如下 - 我的问题是返回的数字不准确,因此当我执行查询时,我得到了返回(这是准确值的两倍和三倍)

vendor     TotalSales   TotalCases
Vendor 1    61.40          6
Run Code Online (Sandbox Code Playgroud)

但如果你手动计算它应该是

vendor     TotalSales   TotalCases
Vendor 1    30.70          2
Run Code Online (Sandbox Code Playgroud)

我必须在查询中更改哪些内容才能返回上述结果?

  Declare @BBC Table
  (
    vendor varchar(250)
    ,vendorcasenum varchar(100)
    ,casenumdate date
  )

  Declare @AllVendor Table
  (
    vendor varchar(250)
  )

  Declare @TotalSalesAmt Table
  (
    vendor varchar(250)
    ,saleamt decimal(10,2)
  )

  Insert Into @TotalSalesAmt (vendor, saleamt) VALUES
  ('Vendor 1', '10.20'), ('Vendor 2', '10.10'), ('Vendor 1', '.40')
  ,('Vendor 1', '20.10'), ('Vendor 2', '20.10'), ('Vendor 3', '20.00')

  Insert Into @AllVendor (vendor) Values …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

4
推荐指数
2
解决办法
2865
查看次数

TSQL - 如何从一串文本中去除借记卡号码?

我们有一个表格,其中存储了一大串文本,其中包含一个借记卡号码,该文本串是从客户发送的电子邮件中复制粘贴的。

如何搜索 7000 多条记录并识别/替换从0000-0000-0000-0000到的卡号XXXX-XXXX-XXXX-0000

sql-server t-sql

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

计算订单之间的平均天数

我想从一个名为 Orders 的表中计算几个订单日期之间的平均天数。对于每个 CustomerID,订单之间的平均天数是多少。示例表如下(img):

CREATE TABLE #Orders(CustomerID int, OrderDate datetime);

INSERT #Orders(CustomerID, OrderDate) VALUES
    (100,'20170114'),(100,'20170123'),(100,'20170129'),
    (101,'20170202'),(101,'20170212');
Run Code Online (Sandbox Code Playgroud)

我试过这个查询:

SELECT  CustomerID, AVG(OrderDate - PriorDate)
FROM (SELECT CustomerID, OrderDate
           , LAG(OrderDate) OVER (PARTITION BY CustomerID ORDER BY OrderDate) as PriorDate
      FROM #Orders where CustomerID = 100)
Run Code Online (Sandbox Code Playgroud)

但是,这会产生:

消息 102,级别 15,状态 1
')' 附近的语法不正确。

sql-server t-sql sql-server-2014

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

在登录触发器中获取 SQL 查询

我需要登录触发器。我需要从 Excel Pivot 文件中捕获进入 SQL Server 的 SQL 查询。

目前我正在使用以下代码:

CREATE TRIGGER [MyLogonTrigger] ON ALL SERVER FOR LOGON
AS 
BEGIN
    IF PROGRAM_NAME() <> 'Microsoft%'

    DECLARE @sqltext VARBINARY(128)
    SELECT @sqltext = sql_handle
    FROM sys.sysprocesses
    WHERE spid = @@spid

    DECLARE @SQLQuery varchar(MAX)
    set @SQLQuery = (select TEXT
    FROM sys.dm_exec_sql_text(@sqltext))

    INSERT INTO TestDatabase.dbo.LogonAudit 
             (
                    ... audit columns ...
             ) 
       Select
                    SUSER_SNAME()
                    ,GETDATE()
                    ,@@SPID
                    ,PROGRAM_NAME()
                    ,ORIGINAL_DB_NAME()
                    ,HOST_NAME()
                    ,client_net_address
                    ,@SQLQuery
   FROM sys.dm_exec_connections 
   WHERE session_id = @@SPID
END;
Run Code Online (Sandbox Code Playgroud)

我面临的问题是@SQLQuery每次都是创建触发器定义代码,而不是刷新数据透视表时从 Excel 文件传递​​给 SQL 的实际查询。

我认为这与登录和实际选择查询执行发生在两个不同的事务(SPID)上有关。 …

sql-server t-sql

4
推荐指数
3
解决办法
2043
查看次数

查看现有的表值参数

我看过很多关于如何创建表值参数的教程 - 但是如何在创建表值参数后查看它?

我更喜欢在 SSMS 中使用 GUI 的方法,但 T-SQL 也足够了。

sql-server t-sql sql-server-2008-r2 table-valued-parameters

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

计算列或触发器

我们目前有一个 oninsert() 触发器设置,每次将行插入到表中时,都会触发更新查询以更新 3 个字段。这些字段是一个简单的计算,例如

field1update = (amt/12)*14
field2update = (amt/12)*16
field3update = (amt/12)*18
Run Code Online (Sandbox Code Playgroud)

触发器是足够的,但它有时会锁定该行,因此暂时无法立即访问它。我的问题是,如果将这些字段转换为(请原谅我的无知)计算列或计算列,我们会看到性能改进吗?

通常这是一个电子表格导入,一次插入大约 20,000 - 25,000 行。

performance sql-server t-sql sql-server-2008-r2 performance-tuning

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

SQL Server 2008 索引视图

我正在尝试添加schemabinding到 SQL Server 2008 中的视图,但出现错误

模式绑定对象中不允许使用语法“Openrowset/Openquery/Opendatasource”。

我使用Openquery是因为我正在查询链接服务器,这是我必须查询的方式。有解决方法吗?

这是我用我的观点尝试的语法

Create View dbo.Test
With Schemabinding
As

  Select * FROM OPENQUERY(191.183.18.101, 'Select * from ls1prod.hrinfo')

Go
Run Code Online (Sandbox Code Playgroud)

schema sql-server-2008 sql-server t-sql

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

TSQL:如何在不改变表/索引的情况下级联删除

我在不应该插入的表中插入了一些数据。我正在尝试删除数据,但它具有 1:M 关系,我还需要删除引用此数据的数据。

我不想改变表/索引,我只需要这个指令来级联:

-- this alters the CONSTRAINT -- not an option:
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

此外,我希望(阅读 -更喜欢)不要更改 IDE GUI 设置。

t-sql cascade

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