标签: t-sql

CATCH 块在不应触发时被触发

在我永无止境地寻求通过保存交易射击自己的过程中,我似乎找到了更多实现任务目的的方法。这次的save transaction子句本身是没问题的,不过正因为如此,我才写了下面的代码。

考虑以下带有嵌套错误处理程序的完整示例:

begin try

  begin try
    select 'Step 1';
  end try
  begin catch
    select 'Step 1 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

  begin try
    select 'Step 2';
    raiserror('Step 2 error', 16, 1);
  end try
  begin catch
    select 'Step 2 handler - handling ''' + error_message() + '''';
    goto commit_and_exit;
  end catch;

end try
begin catch
  select 'Outer handler - handling ''' + error_message() + '''';
  goto commit_and_exit;
end catch

commit_and_exit:

raiserror('Error raised for …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 stored-procedures t-sql error-handling

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

返回所有非 NULL 值都相等的行

是否有一个更简单的 T-SQL 构造“所有这些列在一行上都相等(忽略 NULL)” - 我想说有效:

WHERE MIN(a, b, c) = MAX(a, b, c) OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)
  • 这将相当于所有排列的 COALESCE 相等 - 但没有非聚合 MIN/MAX 函数

3 列的替代方法是:

WHERE ( 
COALESCE(a, b, c) = COALESCE(b, c, a) 
AND COALESCE(a, b, c) = COALESCE(c, a, b) 
AND COALESCE(a, b, c) = COALESCE(b, a, c) 
AND COALESCE(a, b, c) = COALESCE(a, c, b) 
AND COALESCE(a, b, c) = COALESCE(c, b, a) 
) 
OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)

即“所有非空列 a、b、c 必须相等,否则所有列都可能为空” …

sql-server pivot t-sql

7
推荐指数
3
解决办法
2078
查看次数

SQL 和聚合问题

有了这个查询:

SELECT SUM(qty) AS sumQty,
       cnetprodid
FROM   quoteitem
WHERE  ordered = 1
       AND sageSOPOrderReturnLineID IS NOT NULL
       AND LEN(LTRIM(RTRIM(cnetprodid))) > 0
       AND cnetprodid LIKE 'S%'
       AND price > 10
       AND created > DATEADD(MONTH, -3, GETDATE())
GROUP  BY cnetprodid
ORDER  BY SUM(qty) DESC 
Run Code Online (Sandbox Code Playgroud)

每个产品我得到一排,顶排有 294 个 assumQty和 'S10381902' 作为cnetprodid

输入此查询:

SELECT SUM(qty) AS sumQty,
       p.ProdID,
       p.CatID
FROM   quoteitem
       INNER JOIN cds_prod AS p
         ON p.ProdID COLLATE Latin1_General_CI_AS = cnetprodid
       INNER JOIN cds_atr AS a
         ON a.ProdID COLLATE Latin1_General_CI_AS …
Run Code Online (Sandbox Code Playgroud)

sql-server aggregate t-sql

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

大表上的多列统计数据产生较差的估计

我有一个相当大的表(约 2 亿行),虽然统计数据是最新的WITH FULLSCAN,但我的直方图(限制为 200 步)是否可能过于宽泛,优化器无法做出正确的估计 - 换句话说,是不是已经不够“选择性”了?使用这个特定客户的数据库/表,我的查询计划估计与其他人相比相差甚远。

我关注的特定统计数据来自表的 PK/CLUSTERED INDEX。它是一个包含int( ParentId) 和smalldatetime( TimeStamp)的多列统计信息。

当我发出 a 时DBCC SHOW_STATISTICS('SomeTable', 'PK_SomeTable'),我得到以下输出(省略了直方图 - 但如果有帮助,我可以发布它):

Name                    Updated              Rows       Rows Sampled    Steps   Density         Average key length  String Index    Filter Expression   Unfiltered Rows
PK_SomeTable            Jan 31 2014 10:59AM  181170887  181170887       200     2.022617E-05    8                   NO              NULL                181170887

All density     Average Length  Columns
0.0004892368    4               ParentId
5.519651E-09    8               ParentId, TimeStamp
Run Code Online (Sandbox Code Playgroud)

我的大部分查询都是使用这两个列 (ParentIdTimeStamp)的组合来执行的。小的 all 密度值显示了这对的选择性 …

sql-server statistics t-sql execution-plan

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

如何按顺序运行 sql 代理作业。 使用 T-sql

我的要求是按顺序使用 T-sql 运行 SQL 代理作业(例如:job1 到 job10)。这意味着 job2 会在 job1 完成时自动启动。这个过程应该一直持续到 job10 完成。

谢谢你。

sql-server t-sql

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

将 COLLATE 与 UNION 结合使用

怎么COLLATEUNION?我想合并 2 个表(都具有相同的列和相同的类型:)varchar,int, int, decimal

我收到以下错误:

sg 468, Level 16, State 9, Line 1 无法解决 UNION 操作中“Serbian_Latin_100_CI_AS”和“Croatian_CI_AS”之间的排序冲突。

我的 SQL 语句:

select * from #IA_BIH
union 
select * from #IA_MNE  
Run Code Online (Sandbox Code Playgroud)

我应该在哪里插入collate database_default?我尝试了不同的组合,但没有奏效。

sql-server collation t-sql union

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

SSRS 报告调用的存储过程中的事务处理是什么?

考虑以下:

CREATE PROCEDURE dbo.usp_trantest AS
SELECT @@TRANCOUNT as trancount;
GO
Run Code Online (Sandbox Code Playgroud)

当我usp_trantest从 SSMS 中手动调用时,trancount 为 0。如果我运行包含查询相同存储过程的数据集的 SSRS 报告,则 trancount 记录为 1。

执行 SSRS 方法的 T-SQL 跟踪显示存储过程调用的跟踪事件,该事件与我从 SSMS 所做的相同。

是否有一些行为可以根据 SSRS 上下文而改变?比如,为动态 sql 调用或其他东西打开一个隐式事务,或者 SSRS 在 T-SQL 之外创建一个事务上下文?

编辑:

在某人(谢谢,陌生人!)的现已删除的答案中,建议 SSRS 报告的数据集可能已选中“处理查询时使用单个事务”。原来如此!

我做了一些进一步的测试,在未选中此设置的@@TRANCOUNT情况下,无论是在 SSMS 中运行还是从 SSRS 报告中运行都是一样的。

因此,我们似乎可以得出结论,此数据源设置确实会导致 SSRS 报告在运行查询之前在数据库上创建事务上下文。由于这个额外的事务没有出现在 T-SQL 跟踪中,我们可以假设它是使用 API 方法而不是 T-SQL 语句打开的。

stored-procedures ssrs t-sql transaction sql-server-2012

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

添加日期时间时交叉应用失败

在尝试实现将Pivot两行数据表合并为一行的-ed 目标时,我的第一个想法是使用Cross Apply. 通过使用Cross Apply可以识别/生成具有从行的唯一 id 派生的特定列名的每一行。(例如,“纬度”源列的“纬度1”和“纬度2”)。

当我使用INTorFLOAT数据类型时一切都很好,但是当我尝试使用DateTimeall VALUESbecome 时DateTime


示例运输纬度/经度/日期时间

我们在两个不同的日子报道了船舶旅程中的两点:

CREATE TABLE #Shipping
(
     [RouteID]     [INT]  NOT NULL,
     [Latitude]    FLOAT NOT NULL, 
     [Longitude]   FLOAT NOT NULL,
     [Time]        DATETIME NOT NULL

);

INSERT #Shipping(RouteID, [Latitude], [Longitude], [Time])
VALUES          (1,         18.0221,    -63.1206,  '24-Jan-2016'), 
                (2,         17.8353,    -62.99667, '25-Jan-2016');
Run Code Online (Sandbox Code Playgroud)

成功的交叉应用 如果我们CrossApply对前三列的数据使用

  SELECT  col+cast([RouteID] as varchar(1)) new_col
         , X.value
       FROM #Shipping
  CROSS APPLY
  (
      VALUES
         (RouteID, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012 cross-apply

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

从字符串插入日期:CAST 与 CONVERT

考虑以下两种将日期时间 varchar 字符串转换为日期字段的方法:

SELECT convert(date, '2012-12-21 21:12:00', 20) -- Only date is needed
SELECT cast('2012-12-21 21:12:00' as date) -- Only date is needed
Run Code Online (Sandbox Code Playgroud)

两者都返回我期望的内容:不包括时间的日期,作为日期数据类型。

我的问题是:这两种方式有什么利弊吗?

sql-server t-sql type-conversion azure-sql-database cast

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

是否可以在视图中进行此数学运算?

我的任务是为客户创建一个视图。具体来说,它必须在一个视图中。但是,我不确定如何在视图中进行一些数学运算。我不知道这是否可能。但话又说回来,我的心很虚弱。

我使用的是 SQL Server 2008R2,因此高级OVER()功能不起作用。

假设一个人有 400 美元可以花。他们可以花更多的钱,但前 400 美元是免费的。报告的一列将显示该人在某事上花费的金额,另一列将显示该人需要自掏腰包支付的总金额

因此,对于此人的报告中的第一条记录,一列将显示他们已花费的金额,例如 50 美元,然后第二列将显示 0 美元。在幕后,他们还有 350 美元可以花。

下一个记录是该人花费 300 美元。第二列仍将显示 0 美元,而在幕后,最初的 400 美元现在是 50 美元。

该人的第三项记录显示他们花了 75 美元,但他们从最初的 400 美元中只剩下 50 美元。第二列现在应该有 25 美元的价值。他们已经用尽了最初的 400 美元,现在正在花自己的钱。

第四条记录显示他们花了 40 美元,所以现在第二列将显示 65 美元。等等...

我已经简要阅读了 CTE 和表值函数等,但是是否可以将它们以任意组合使用以提供上述所需的行为?

以下是结构和所需结果的一些示例代码

CREATE TABLE Payroll (
    PersonID int,
    PlanCode varchar(10),
    Deduction int NULL
)
GO

INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
  ,(1, 'Dental', 250)
  ,(1, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 view running-totals

7
推荐指数
3
解决办法
605
查看次数