我有一个表示一组标志的 tinyint 列。假设我想知道是否设置了特定位,我如何在存储过程中执行按位 AND/OR 操作?
我有一个查询返回类似的内容:
Name Gender Job date of hire
John M mechanic 2012-05-08
John M electrician 2010-01-01
Vicky F scientific 2012-11-11
Bob M NULL NULL
Run Code Online (Sandbox Code Playgroud)
我需要每个人的第一份工作的姓名、性别和工作名称。但我不知道怎么做。我的查询如下所示:
select name,gender,jobname,hiredate
from person p
left join job j on p.personid = j.personid
Run Code Online (Sandbox Code Playgroud)
我使用的是 Microsoft SQL Server 2000
我需要这个结果:
Name Gender Job
John M electrician
Vicky F scientific
Bob M NULL
Run Code Online (Sandbox Code Playgroud) 我有一个案例,我正在运行的查询需要很长时间。当我检查sys.dm_exec_requests它blocking_session_id是一个负值时,具体来说是-2。等待是一个LCK_M_X,阻塞的命令是一个DELETE语句。据我所知,目前没有其他东西触及那张桌子。事实上,唯一的活动请求是被阻止的连接和查询检查sys.dm_exec_requests。当我查看sys.dm_tran_session_transactions被阻止的会话时,只有一个出现。
我有这个:
CREATE TABLE people
(
id bigserial,
timestamp timestamptz DEFAULT now() NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE "personal information"
(
id bigserial,
"person id" bigint NOT NULL,
timestamp timestamptz DEFAULT now() NOT NULL,
"data's timestamp" timestamptz,
"field" text NOT NULL,
"value" text,
PRIMARY KEY (id),
FOREIGN KEY ("person id") REFERENCES people (id) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT INTO people RETURNING id; -- Syntax error.
INSERT INTO people; -- Syntax error.
Run Code Online (Sandbox Code Playgroud)
为什么我的插入失败?事实上,“people”表中的所有列都是自动的:该id列是一个 bigserial,并且该列timestamp …
我最近遇到一个问题,tSQLt测试需要很长时间才能运行。
所测试的过程正在执行 38 个表 (!) 连接(具有 37 个伪造的表和一个表值参数)。
只有两个伪造的表和 TVP 插入了任何行
编译时间非常慢。
显示跟踪标志 8675
End of simplification, time: 0.002 net: 0.002 total: 0 net: 0.002
end exploration, tasks: 549 no total cost time: 0.013 net: 0.013 total: 0 net: 0.015
end search(0), cost: 13372.9 tasks: 3517 time: 0.012 net: 0.012 total: 0 net: 0.028
end exploration, tasks: 3983 Cost = 13372.9 time: 0 net: 0 total: 0 net: 0.028
end search(1), cost: 6706.79 tasks: 10187 time: 0.024 net: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个查询,该查询返回多个表中给定值的计数。
现在,我正在使用以下查询
SELECT COUNT(*) AS SL,
(
SELECT COUNT(*)
FROM [Sales Line Archive]
WHERE [Document No_] = 123
) AS SLA
FROM [Sales Line]
WHERE [Document No_] = 123
Run Code Online (Sandbox Code Playgroud)
它返回一个结果,第一列是 Sales Line 中的行数,第二列是 Sales Line Archive 中的行数。
但是,我想使用IN子句请求多条记录,以便获得如下结果
Document No_, SL, SLA
1, 3, 0
2, 0, 4
3, 2, 1
Run Code Online (Sandbox Code Playgroud) 每个人,
我无法弄清楚以下用户定义函数中缺少什么:
CREATE OR ALTER FUNCTION ufn_GetSalaryLevel(@Salary money)
RETURNS VARCHAR(10)
AS
BEGIN
IF (@Salary < 30000) RETURN 'Low';
ELSE IF (@Salary <= 50000) RETURN 'Average';
ELSE RETURN 'High';
RETURN '';
END;
SELECT dbo.ufn_GetSalaryLevel(100440)
Run Code Online (Sandbox Code Playgroud)
输出仅包括“低”/“平均”/“高”返回值的第一个字符:
-----------------------------------------------------------------------
H
(1 row affected)
Run Code Online (Sandbox Code Playgroud)
为什么 MS SQL Server Management Studio 不考虑 VARCHAR(10)?
提前致谢!
Ps 请在下面找到我的输出 - 我不明白为什么它不能按预期工作?
ps2:该函数只有一个参数,我好像没有找到另一个同名的函数……下面可以找到与该函数相关的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date, ,>
-- Description: <Description, ,>
-- =============================================
CREATE FUNCTION …Run Code Online (Sandbox Code Playgroud) 我经常遇到以下问题。我有两张间隔表。它们受日期限制(没有时间部分)。每个表中的间隔不重叠。
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-03 | 2015-03-02 |
| 2015-03-05 | 2015-04-01 |
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-07 | 2015-02-27 |
| 2015-03-01 | 2015-03-13 |
| 2016-01-01 | 2016-01-02 |
我想找到两个表的集合差异,即代表第一个表中而不是第二个表中的时间的间隔。
上面的虚拟示例所需的输出:
| 开始时间 | 结束时间 |
|---|---|
| 2015-01-03 | 2015-01-06 |
| 2015-02-28 | 2015-02-28 |
| 2015-03-14 | 2015-04-01 |
即,如果第一个表的日期在下面用黄色标记,并且第二个表的范围用框包围,我将寻找未装箱的黄色日期的连续范围。
我目前将两端都视为包含间隔,并使用 DateTime 作为时间戳。我当前的方法是通过三重自连接(恶心)获取第二个表的补集,然后通过连接将结果与第一个表相交。不好玩。
有更好的方法吗?
我有几个相同的(据我所知)SQL Server,我最近在其中添加了 sp_WhoIsActive(向一些人展示了我有多喜欢这个工具),但其中一个不允许我创建存储过程。我收到一个我非常熟悉的错误,该错误涉及 CTE 需要前面的语句以分号结尾。其他服务器均未收到此错误。
我将脚本归结为以下内容以重新创建问题:
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET ANSI_WARNINGS ON;
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT ON;
GO
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = 'sp_WhoIsActive')
EXEC ('CREATE PROC dbo.sp_WhoIsActive AS SELECT ''stub version, to be replaced''')
GO
ALTER PROC dbo.sp_WhoIsActive
(
@filter sysname = ''
)
AS
BEGIN;
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET QUOTED_IDENTIFIER ON;
SET ANSI_PADDING ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET ANSI_WARNINGS ON; …Run Code Online (Sandbox Code Playgroud) sql-server ×8
syntax ×2
t-sql ×2
blocking ×1
cte ×1
datetime ×1
functions ×1
group-by ×1
insert ×1
interval ×1
performance ×1
postgresql ×1
ssms ×1
tsqlt ×1