标签: t-sql

MSSQL Server 2012 查询我们是否需要 T-SQL 来使用 IF 条件进行查询?

我有一个包含表 Student(StudId, StudName,...) 和 Grades (GradeExam1, GradeExam2,..) 等的数据库。我想做一个查询来为每个年级分配一个字母等级。我正在考虑做类似的事情:

SELECT StudId, GradeExam1 AS 'A' IF GradeExam1>= 90 AND GradeExam1 <=100
UNION
SELECT StudID, GradeExam1 AS 'B' ..........
Run Code Online (Sandbox Code Playgroud)

我知道我可以在普通 SQL 中使用非条件别名,但我从未在 SQL 查询中使用过条件别名。

或者我可能需要 T-SQL 来为给定的考试做一个循环,而不是为不同的条件做一个 select 语句的联合?

提前致谢。

sql-server t-sql

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

我可以创建一个视图来编辑 ID 映射表而不看到 ID 吗?

我有 2 个表,A 和 B,带有一个int主键和一个string名称。

我有一个第三个表 C,其中有 2 列将 A 和 B 的 ID 映射在一起。我想创建一个视图来编辑表 C 中的映射,但我希望视图显示Name值而不是IDs. 该视图将通过 SQL Server Management Studio 进行编辑。

例如,视图应该允许用户在项目列中输入“Item4”,在附件列中输入“Accessory1”,表 C 更新为新的行映射“4”到“1”。

在此处输入图片说明

我想知道是否可以将其设为可编辑视图,这样我就不必费心编写整个应用程序来管理它。

如果我转到 Microsoft SQL Server Management Studio 中的视图并右键单击,我可以编辑前 200 行。我知道此功能的限制是我只能在更改为单个表时进行编辑。我只会编辑一个表,所以可能有办法让它工作。有办法吗?(我的用户是熟悉 SQL Server 并且更喜欢直接访问他们的数据的人(交易员))。

sql-server ssms t-sql view

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

强制 T-SQL 查询使用并行性好吗?

这可以通过在查询选项中调用跟踪标志 8649 来完成。

OPTION (QUERYTRACEON 8649)

此跟踪标志导致查询的成本为 0,这将始终低于并行性的成本阈值,因此该查询将被视为并行计划。

试图以这种方式强制 T-SQL 查询使用并行性是否有任何缺点?

示例教程如何强制并行

performance sql-server optimization parallelism t-sql query-performance

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

在 where 子句中使用日期时间和日期数据类型时是否有截止时间?

我有一个标题为reached_date的列。在我的查询中,该列的大部分值是2016-09-30 23:59:59.997

然后我有一个 where 子句,内容如下:

WHERE achieved_date between '20160901' and '20160930'
Run Code Online (Sandbox Code Playgroud)

具有 2016-09-30 23:59:59.997 值的记录没有包含在我应该包含的结果中。我的意思是交易记录在 9 月 30 日。

如果这是一个奇怪的数据类型问题,有什么想法吗?

sql-server datatypes t-sql datetime date

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

这个 MERGE 语句中的更新是多余的吗?

我正在尝试提高复杂存储过程的性能。存储过程内部是以下MERGE语句。我对MERGE语法不是很熟悉。

[Contact].[PhoneNumber]表如下所示:

CREATE TABLE [Contact].[PhoneNumber]
(
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [PhoneNumber] [nvarchar](255) NOT NULL
    [InsertedAtDateTimeUTC] [datetime2](7) NOT NULL DEFAULT(sysutcdatetime())
)
Run Code Online (Sandbox Code Playgroud)

合并看起来像这样:

;WITH _ContactPhoneNumbers ([PhoneNumber]) AS 
(
    SELECT DISTINCT ([#ChannelData].[CallerAni])
    FROM [#ChannelData]
)
MERGE [Contact].[PhoneNumber] WITH (HOLDLOCK) _target
USING [_ContactPhoneNumbers] _source ON [_target].[PhoneNumber] = [_source].[PhoneNumber]

WHEN NOT MATCHED THEN
    INSERT ([PhoneNumber])
    VALUES ([PhoneNumber])

WHEN MATCHED THEN
    UPDATE 
        SET [_target].[PhoneNumber] = [_source].[PhoneNumber]
        OUTPUT INSERTED.[Id], [_source].[PhoneNumber] INTO #Contact_PhoneNumber_Output ([Id], [PhoneNumber]);   
Run Code Online (Sandbox Code Playgroud)

我把它读为:

如果表PhoneNumber中不存在 …

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

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

插入时触发将新记录中的列更新为 CURRENT_TIMESTAMP

好的,所以我试图在最初插入记录时将特定记录中的列更新为 CURRENT_TIMESTAMP。这就是我所拥有的,否则我就迷路了。

CREATE TRIGGER dbo.TrgUpnInsert
  ON [CNLH Security Authentication].dbo.DateTimestamp
    AFTER INSERT, 
    INSERT INTO [CNLH Security Authentication].dbo.EntranceInformation (DateTimestamp) Values (CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

trigger sql-server t-sql timestamp row-modification-time

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

与除法相加

我正在尝试在 SQL Server 2008 中进行计算,但得到的结果不正确。下面是示例 DDL 和我使用的查询,应该如何重写我的语句以产生准确的结果?

我想要的结果是:

0.000029
0.000277142
0.003001501
0.000960527
0.004321608
Run Code Online (Sandbox Code Playgroud)

这是 DDL 和查询:

Declare @TableTest Table
(
  fid int
  ,field1 int
  ,field2 int
  ,field3 int
  ,field4 int
)

INSERT INTO @TableTest (fid, field1, field2, field3, field4) Values
(1, 17, 12, 0,  1000000),
(2, 277,    0,  511,    1000000),
(3, 3000,   0,  500,    1000000),
(4, 900,    59, 1590,   1000000),
(5, 1300,   3000,   5000,   1000000)
Run Code Online (Sandbox Code Playgroud)

产生这个结果(不正确)

fid (No column name)
1   0.0000000000
2   0.0000000000
3   0.0000000000
4   0.0000000000
5   0.0000000000 …
Run Code Online (Sandbox Code Playgroud)

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

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

NULL 时的计算字段

我的表中有两个字段:A int, B int。我想添加两个使用这两个字段& 的计算字段 ( CF1& CF2) 。AB

CF1 = (case when [A]>[B] then (CF1=3) else case when [A]<[B] then (CF1=0) else (CF1=1) end end)

CF2 = (case when [A]<[B] then (CF2=3) else case when [A]>[B] then (CF2=0) else (CF2=1) end end)
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是当两个字段 ( A& B) 是NULL,CF1并且CF2是 = 1 时。如何避免这种情况?我的意思是,当领域中的任意一个A或者BNULL,无论CF1CF2也应该是NULL

换句话说:应该只有在0,1或3的值CF1和 …

null sql-server t-sql computed-column

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

寻找连续时间段并生成id的优雅代码

我有一个包含两个字段的表:时间和值,它们都是整数,我想找到值大于 0 的连续周期,然后用连续整数标记“值> 0”周期。

例如,如果我有这样的输入表:

输入表

我想要这样的输出表:

输出表

使用三个 CTE 和两个 row_number() 函数,我能够做到这一点。但是我觉得查询太麻烦了。有没有人有更优雅的代码来做到这一点?

我正在使用 sql server 2016 开发人员版。

这是我的代码:

CREATE TABLE #test1(
    [time] [int] NULL,
    [value] [int] NULL
)

insert into #test1
values(1,0),(2,0),(3,1),(4,0)
    ,(5,1),(6,2),(7,0),(8,0)
,(9,1),(10,2),(11,3),(12,0)
,(13,0),(14,0),(15,1),(16,0);

;with a1 as
(select *, [time] -  row_number() over (order by [time]) as group_num
    from #test1
where value>0),
a2 as 
(select distinct group_num from a1
),
a3 as
(select group_num, row_number() over (order by group_num) as group_id
from a2)
select a1.*, a3.group_id
    from a1 left join …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql window-functions

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

获取所有表类型的名称和定义

我知道如何创建表类型(用作表值参数) - 但是一旦创建,我如何查看它?

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

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