标签: sql-server-2014

触发器 - 是否有必要 BEGIN / COMMIT TRAN

我想像这样创建 INSTEAD OF 触发器:

CREATE TRIGGER [dbo].[DeleteCompany]
ON [dbo].[Company]
 INSTEAD OF DELETE
  AS 
  DECLARE @CompanyID int
  SELECT @CompanyID = deleted.CompanyID FROM deleted

  BEGIN TRAN
  DELETE FROM Project WHERE CompanyID = @CompanyID
  DELETE FROM CompanyPerson WHERE CompanyID = @CompanyID
  UPDATE PersonCompany SET CompanyID = null WHERE CompanyID = @CompanyID

  DELETE [Company]
     FROM DELETED D
     INNER JOIN [Company] T ON T.CompanyID = D.CompanyID
  COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

因此,我可以确定,这些操作是一个原子操作。但这有意义还是 TRIGGER 总是在事务内执行?

另外,如果公司在另一个触发器中被删除,会发生什么情况,如下所示:

CREATE TRIGGER [dbo].[DeleteSecurityLevel]
ON [dbo].[SecurityLevel]
 INSTEAD OF DELETE
  AS 
  DECLARE @SecurityLevelID int
  SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server triggers sql-server-2014 azure-sql-database

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

通过作业运行 SP 时的响应数据截断

主题:

我每个月都会创建一份报告。报告的创建包括两个步骤:

  1. 从我们的服务中获取一个 XML 并将其存储在 DB 中;
  2. 解析 XML 并创建文件。

在过去的几个月里,我在手动模式下创建了报告。现在我想自动化这些东西。但这里有一个

问题:

第二步(解析 XML 和文件创建)运行起来很有魅力,但第一步我观察到了奇怪的行为。

我得到了获取 XML 的存储过程:

ALTER PROCEDURE [Structure].[GetXML]
    @LastActDate date,
    @CurActDate date
AS
BEGIN
    SET NOCOUNT ON;

    begining:

    DECLARE @URI varchar(2000),
            @methodName varchar(50),
            @objectID int,
            @hResult int,
            @setTimeouts nvarchar(255),
            @serv nvarchar(255) = 'http://example.com/docs/',
            @result nvarchar(max) = ''

    DECLARE @t TABLE(Resp nvarchar(max))

    declare @timeStamp nvarchar(50) = convert(nvarchar(50),CURRENT_TIMESTAMP,127)

    declare @CurDate date = dateadd(day,0,getdate())

    --EXEC @hResult = sp_OACreate 'WinHttp.WinHttpRequest.5.1', @objectID OUT
    EXEC @hResult = sp_OACreate 'MSXML2.XMLHTTP', @ObjectID OUT

    SELECT  @URI …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures sql-server-2014

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

临时表:CREATE 与 SELECT INTO

我搜索并找到了这篇关于 SQL Server 中临时表的文章,因为我在我们的一个存储过程中遇到了一行说:

SELECT Value SomeId INTO #SomeTable FROM [dbo].[SplitIds](@SomeIds, ';')
Run Code Online (Sandbox Code Playgroud)

我知道它#SomeTabletempdb作为临时表存储的。但是,我不明白为什么我们不必先使用,CREATE TABLE #SomeTable因为它是在提到的文章中写的。我们的代码运行良好,我只是不明白为什么使用SELECT ... INTO #SomeTable. CREATE TABLE #SomeTable一开始加的话会有什么后果?我们会得到性能上的任何差异吗?该表会存储在另一个位置吗?

t-sql sql-server temp-tables sql-server-2014

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

如何将大量数据从一张表复制到同一数据库中的另一张表?

我在同一个数据库中有两个具有相同列结构的表:TableATableB.

TableA没有任何索引,但TableB有一个非聚集唯一索引。

TableA有 2.9 亿行数据需要复制到TableB.

由于它们都具有相同的结构,我已经尝试过

INSERT INTO TableB 
    SELECT * 
    FROM TableA;
Run Code Online (Sandbox Code Playgroud)

它执行了几个小时,并产生了一个巨大的日志文件,填满了磁盘。结果磁盘空间不足,查询被终止。

我可以缩小日志文件。如何有效地将这些多行数据复制到另一个表?

sql-server sql-server-2014

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

SQL Server 为数据库中的每个表添加唯一标识符

我创建了一个带有 SQL Server 2014 后端的 C# 应用程序。我只是打算为自己使用该应用程序,但现在我对其他用户产生了兴趣。我从来没有考虑过将用户 ID 添加到任何表中,我的问题是如何生成一个脚本来向所有表添加一个 uniqueid 列。我不想为每个用户创建一个新数据库,并且希望每个表都有一个唯一的用户列。

c# sql-server sql-server-2014

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

将金额分配到 SQL Server 中的几行

我有任意金额要花,比如说 1000 美元

我也有几十行,假设员工以他们的工资为一列

我如何按优先级顺序在员工之间分配 1000 美元的预算,以便他们每个人都获得工资列中的值,直到钱都花完?一旦预算全部用完,其余的员工就会剩下零。

Employee, Rank, Salary
John, 1, 500$
Anne, 2, 400$
Rob, 3, 300$
Bill, 4, 200$
Run Code Online (Sandbox Code Playgroud)

结果应该是:

John, 1, 500$, 500$
Anne, 2, 400$, 400$
Rob, 3, 300$, 100$    --Only 100 left in the budget
Bill, 4, 200$, 0$
Run Code Online (Sandbox Code Playgroud)

知道如何在没有光标的情况下做到这一点吗?

sql-server sql-server-2014

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

将两列数据合并为一列,留下空值

我的表格有四列,如下所示

表 - 订阅有这样的数据

  part_id     subscription   policylicense    enterpriselic
   part1        sub1          null                null
   part2        sub1          pl1                 null
   part3        sub1          null                enterpr1
Run Code Online (Sandbox Code Playgroud)

我想得到下面这样的数据

  part_id     subscription   license    
   part2        sub1          pl1                 
   part3        sub1          enterpr1                
Run Code Online (Sandbox Code Playgroud)

如何将合并的许可证数据放入一列,在同一个表中留下空值..我在这里使用 sql server

任何人都可以帮助解决这个问题,这将非常感谢我.. 提前非常感谢..

sql t-sql sql-server stored-procedures sql-server-2014

3
推荐指数
2
解决办法
8257
查看次数

如何使用数据透视表进行分组

有一张这样的桌子:,

name  ZK04_COUNT  ZK05_COUNT  ZK04_PRICE  ZK05_PRICE
A     15           0             150.00      0 
A     0            20              0         223.00
B     11           0             75.00       0
B     0            24              0         250.00
Run Code Online (Sandbox Code Playgroud)

我正试图将它转变成这样的:

name  ZK04_COUNT  ZK05_COUNT  ZK04_PRICE  ZK05_PRICE
A         15          20        150.00       223.00
B         11          24         75.00       250.00

Run Code Online (Sandbox Code Playgroud)

我的代码是这样的:

SELECT *
FROM (
      SELECT 
       r.name
      ,r.AUART
      , CASE WHEN r.AUART = 'ZK05' THEN count(r.MATNR) ELSE '' END AS ZK05_COUNT
      , CASE WHEN r.AUART = 'ZK04' THEN count(r.MATNR) ELSE '' END AS ZK04_COUNT
      , CONVERT(money, sum(CAST(netpr as …
Run Code Online (Sandbox Code Playgroud)

sql sql-server pivot-table case sql-server-2014

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

选择不在另一个表中的键需要永远

我有一个这样的查询:

select key, name from localtab where key not in (select key from remotetab);
Run Code Online (Sandbox Code Playgroud)

查询需要永远,我不明白为什么。

localtab是本地表,remotetab是另一台服务器中的远程表。keyint在两个表中都有唯一索引的列。当我分别查询两个表时,只需几秒钟。

sql-server sql-server-2014

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

如何在不输入两次公式的情况下将负结果设置为零

我知道如何将负值设置为零:

select case when (formula) < 0 then 0 else (formula) end as result from tab
Run Code Online (Sandbox Code Playgroud)

但是如果“公式”是一个很长的公式呢?然后我必须输入两次。有没有办法在不输入两次公式的情况下获得相同的结果?

我的实际情况是这样的:

select
  sum
  ( 
      case when 
      (t1.x + t2.x + t3.x) * t4.p - (t5.x + t6.x + t7.x) * t8.p ) < 0
      then 0 
      else 
      (t1.x + t2.x + t3.x) * t4.p - (t5.x + t6.x + t7.x) * t8.p )
      end
  ) as result
from 
     t1 
     left join t2 on t1.x = t2.x 
     left join t3 on t1.x = t3.x …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2014

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