标签: t-sql

将 If 语句添加到存储过程

我正在Insert Into我的存储过程中运行一条语句,该语句正在从 a 接收数据Table Value Parameter 我刚刚意识到我需要在执行插入之前首先验证表中不存在数据,因此我试图将我的过程更改为此

ALTER PROC [dbo].[CMT]
(@TempTable AS dbo.TableValue_ET READONLY)
AS
BEGIN

if b.[empID] NOT IN (Select [empID] FROM [Habib].[dbo].[SE])
BEGIN
  INSERT INTO [Habib].[dbo].[SE]([empID],[POD],[empNotes],[hiredate],[terminationdate],[terminationtime],[address],[city],[state])
  SELECT
  [empID]
  ,[POD]
  ,[empNotes]
  ,convert(varchar(10), [b].[hiredate], 101)
  ,convert(varchar(10), [b].[terminationdate], 101)
  ,[terminationtime] = LTRIM(RIGHT(CONVERT(VARCHAR(20), [b].[terminationdate], 100), 7))
  ,[address]
  ,[city]
  ,[state]
  FROM @TempTable b
END

END
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试保存此更新的语法时,出现错误

消息 4104,级别 16,状态 1,过程 UpdateShippingExceptions,第 7 行
无法绑定多部分标识符“b.empID”。

我必须更改什么才能empID在插入之前首先检查表中是否已经存在?

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

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

计算字段更新每一行

我在表中添加了一个计算字段,并且只想更新NULL行(或“新”行)。出了点问题,DateTime当插入 1 行时,我的表中的每一行都用当前更新。这是Create Table语法,我必须做什么才能仅使用当前更新“新”行DateTime

CREATE TABLE [dbo].[SE](
[dbID] [int] IDENTITY(1,1) NOT NULL,
[uqID] [varchar](31) NOT NULL,
[POD] [varchar](255) NULL,
[EC] [varchar](255) NULL,
[S1] [varchar](35) NULL,
[S2] [varchar](35) NULL,
[S3] [varchar](35) NULL,
[S4] [varchar](35) NULL,
[S5] [varchar](35) NULL,
[S6] [varchar](35) NULL,
[S7] [varchar](35) NULL,
[PSD] [varchar](50) NULL,
[DS] [datetime] NULL,
[CN] [varchar](max) NULL,
[autodate]  AS (getdate()),
PRIMARY KEY CLUSTERED 
(
[dbID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS = …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 default-value computed-column

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

如何找到页面的逻辑顺序

当我有一个带有逻辑排序的聚集索引时ASC,有没有办法在输出的数据页中找到逻辑排序DBCC PAGE

sql-server t-sql sql-server-2012

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

为逗号分隔的字符串中的每个值创建一行

我目前正在尝试从执行以下操作的表创建视图:

Table A
??????????????????????????????? 
? PART NUMBER ?   FILE NAME   ?
???????????????????????????????
?  PN0001-01  ?      FOO      ?
?  PN0002-01  ?      BAR      ?
?  PN0003-01  ?    FOO,BAR    ?
?  PN0004-01  ?  BAR,FOO,FOB  ?
???????????????????????????????
Run Code Online (Sandbox Code Playgroud)

创造

View B
??????????????????????????????? 
? PART NUMBER ?   FILE NAME   ?
???????????????????????????????
?  PN0001-01  ?      FOO      ?
?  PN0002-01  ?      BAR      ?
?  PN0003-01  ?      FOO      ?
?  PN0003-01  ?      BAR      ?
?  PN0004-01  ?      BAR      ?
?  PN0004-01  ?      FOO      ?
?  PN0004-01  ?      FOB      ? …
Run Code Online (Sandbox Code Playgroud)

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

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

查询日期范围

我有一个存储过程,我想第一次在@startdate&之间收集数据,@enddate然后我想将该数据与前一年进行比较。

我尝试了以下语法(显然是为了测试)以确保在添加到我的生产语法之前我得到了我想要的日期输出。但是,这给了我一个错误

消息 102,级别 15,状态 1,第 11 行
“-”附近的语法不正确。
消息 102,级别 15,状态 1,第 14 行
“-”附近的语法不正确。

这是我尝试的语法。为了输出所需的日期,我会改变什么?

Declare @startdate date = '20170101'
    ,@enddate date = '20170212'

--one year prior to @startdate
Select CAST(DateAdd(yy, -1, @startdate) As Date)

--One year prior to @enddate
SELECT CAST(DateAdd(yy, -1, @enddate) As Date)

--This will get first day of prev yr
SELECT DATEADD(YEAR, DATEDIFF(YEAR, 0,
        DATEADD(YEAR, –1, @startdate)), 0)

--This will get last day of prev yr
SELECT DATEADD(MILLISECOND, –3, DATEADD(YEAR, …
Run Code Online (Sandbox Code Playgroud)

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

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

如何在没有提示的情况下强制合并连接

前段时间我使用了查询提示,但后来意识到大多数时候 SQL Server 比我更聪明。 构建额外的索引/重新组织数据或查询并获得比强制服务器使用计划要好得多的结果这通常效率低下,但对于某些数据子集来说速度足够快。但现在我处于一种我不知道如何更好地组织数据的情况。

我有两张桌子。第一个表 T1 是 (Id, CustomerId),第二个表 T2 具有相同的列。我想在 CustomerId 上加入 T1 到 T2。并获得前 N 行。在这种情况下,优化器看到我只需要 N 个 top 并说,“嘿,我将使用循环并很快找到 N 个匹配项,尤其是当我使用索引查找时。” 但它不起作用,因为没有满足条件的数据。因此它使用 aloop join来连接一个 25m 的表和一个非常慢的 100k 表。

在此处输入图片说明

当我强制 SQL Server 使用合并联接时,我得到以下计划,该计划在一秒钟内执行:

在此处输入图片说明

我不想强迫它有两个原因:

  • 首先,正如我之前所说,SQL Server 足够智能。
  • 其次,我使用的是 ORM,并且很难在生成的查询中注入提示,所以我想避免它。

在这种情况下我该怎么办?

join sql-server optimization t-sql execution-plan

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

SQL中的除法

我想将 int 数量除以一个数字,但我的输出不是我想要的。这是我的 DDL

Create Table Orders 
(
    id int IDENTITY(1,1) PRIMARY KEY NOT NULL
    ,partid varchar(100) NOT NULL
    ,qtyordered int DEFAULT '0'
    ,orderedby varchar(100) NOT NULL
    ,ordereddate date DEFAULT GETDATE()
)

Insert Into Orders (partid, qtyordered, orderedby) VALUES
('SS100', 10, 'James'), ('RR200', 5, 'Bob'), ('NN300', 3, 'Jake'), ('OO400', 5, 'Blue')
Run Code Online (Sandbox Code Playgroud)

现在我已经尝试使用 SQL Server 函数Ceiling()Floor()但没有得到我想要的输出。这是我试过的查询,我需要在 SQL Server 中做什么才能得到 2, 2, 1 的输出?

Select
partid
,CEILING(qtyordered/3) As [First] --want to be 2
,CEILING(qtyordered/3) As [Second] --want to …
Run Code Online (Sandbox Code Playgroud)

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

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

T-SQL 的 RowNum(不是 TOP #)

试图运行更新,但我想逐步完成它,因为它有相当多的数据并且不想一次全部爆炸。

在 oracle 中,选择我想要的行要容易一些,因为您可以将它包含在WHERE子句中,但在 T-SQL 中您将它包含在select. 我想写一些类似的东西:

Update Instances
set thing = 'new thing'
Where rownum<500
Run Code Online (Sandbox Code Playgroud)

基本上想一次做500个,这个语法在TSQL中可行吗?

sql-server t-sql update

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

从左表返回所有数据

我的左表比右表包含更多的商店名称。我以为快速左连接会返回该数据集,但无济于事!

Data In From 子句有最多的选项,我想显示所有这些 Data In Left Join 子句有一些但不是我想显示的所有选项

我创建了 CTE 来获取 SUM() 并将数据拉到主查询中存在于左连接表中

这是我使用的查询,它没有给出我想要的结果。

;With DataFromOne As
(
    Select   StoreName
             ,DataFromOne = Count(ramalad)
    FROM     DataFromOne
    WHERE    EntryDate BETWEEN '20170101' AND '20170331'
    GROUP BY StoreName
)
Select   ec.StoreName
         ,[Emp Count] = COUNT(Employee)
         ,[PT Count] = COALESCE(ec.DataFromOne,0)
FROM     DataFromOne ec
LEFT OUTER JOIN DataFromTwo fji
ON       ec.StoreName = fji.StoreName
WHERE    fji.saleDate BETWEEN '20170101' AND '20170331'
GROUP BY ec.StoreName, ec.DataFromOne
ORDER BY ec.StoreName ASC;
Run Code Online (Sandbox Code Playgroud)

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

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

当 value 为 null 时,对 WHERE 语句中变量的行为感到困惑

我有一个像(SQLServer 2008)的表:

CREATE TABLE [dbo].[my_test_table](
    [productId] [int] NOT NULL,
    [purchaseId] [bigint] NOT NULL,
    (some other columns....),
 CONSTRAINT [PK_my_test_table] PRIMARY KEY CLUSTERED 
(
    [productId] ASC,
    [purchaseId] ASC
))
Run Code Online (Sandbox Code Playgroud)

大约有 1000 万行。

我想要一个查询,返回产品的总行数,或者如果产品未指定,则返回所有产品的总行数。就像是:

declare @productId int

set @productId = 320

select count(*)
from my_test_table t with(nolock)
where productId = @productId
or @productId is null
Run Code Online (Sandbox Code Playgroud)

问题是查询比等效查询花费时间要多得多:

select count(*)
from my_test_table t with(nolock)
where productId = 320
or 320 is null
Run Code Online (Sandbox Code Playgroud)

我们如何解释这种行为?

以下是执行计划: 在此处输入图片说明

sql-server-2008 sql-server t-sql

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