是否可以有一个基于 Identity 列的具有 PK 的表?
假设我有一个客户表,两个字段对于我们的案例很重要,Id即 isPK nvarchar(20)和SequenceIdwhich is int identity(1,1)。我想要一个存储过程,该过程将具有(除其他外)一个参数@CustomerType,并根据此参数生成值Id并将新行插入表中。像这样的东西:
CREATE PROCEDURE createCustomer
@CustomerType int,
@GivenName nvarchar(20),
@Surname nvarchar(20),
@BirthDate date = null
...
AS
BEGIN
SET NOCOUNT ON;
DECLARE @prefix nvarchar(1) = N'x'
IF @CustomerType = 1
BEGIN
SET @prefix = N'P'
END
...
ELSE
BEGIN
SET @prefix = N'x'
END
INSERT INTO [dbo].[Customers]
([Id],
[GivenName],[Surname],[BirthDate])
VALUES
(@prefix + (SequenceId + 1000000),
@GivenName,@Surname,@BirthDate);
SELECT INSERTED.Id AS CustomerId; …Run Code Online (Sandbox Code Playgroud) 如何在 SQL Server Management Studio 2008 中查看给定时间范围内的存储过程错误列表?
我可以将文字表名称传递到内置函数中CHANGETABLE。我想知道这是如何完成的以及是否可以在我自己的存储过程/内联函数中完成。
在此之上。如果可以先将其传递给文字常量,然后将其传递给函数,这样我就可以获得表 ID,而不必在两个地方指定表名称。
提前致谢。
尝试获取正在执行的作业的会话 ID
;with JobDetails as
(
select Job_Id = left(intr1,charindex(':',intr1)-1),
Step = substring(intr1,charindex(':',intr1)+1,charindex(')',intr1)-charindex(':',intr1)-1),
SessionId = spid
from master.dbo.sysprocesses x
cross apply (select replace(x.program_name,'SQLAgent - TSQL JobStep (Job ','')) cs (intr1)
where spid > 50 and x.program_name like 'SQLAgent - TSQL JobStep (Job %'
)
select *
from msdb.dbo.sysjobs j
inner join JobDetails jd on j.job_id = jd.Job_Id
Run Code Online (Sandbox Code Playgroud)
但它会引发以下错误
消息 8169,级别 16,状态 2,第 47 行 从字符串转换为 uniqueidentifier 时转换失败。
我尝试将其转换job_id为varbinary但没有产生任何结果
;with JobDetails as
(
select Job_Id = left(intr1,charindex(':',intr1)-1), …Run Code Online (Sandbox Code Playgroud) 我想以这样的方式返回数据,即如果代码具有连续的活动日期和结束日期,则数据应给出最小活动日期和最大结束日期,但如果代码已停止,则应显示两个日期
例如桌子
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| ABC | 1/1/2011 | 30/6/2011 |
|1000| ABC | 1/7/2011 | 30/6/2012 |
|1000| ABC | 1/7/2012 | 30/6/2013 |
|1001| ABC | 1/7/2013 | 30/6/2014 |
|1001| ABC |12/20/2015 |12/20/2017 |
|1003| ABC | 1/1/2011 |30/6/2011 |
|1003| ABC | 1/7/2012 |30/6/2013 |
|1003| ABC | 1/7/2014 |30/6/2015 |
|1003| ABC | 1/7/2015 |12/20/2017 |
+----+------+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
欲望输出
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| …Run Code Online (Sandbox Code Playgroud) 我正在使用 Tsql 脚本来恢复多个数据库。
RESTORE DATABASE XXX_M
FROM DISK = 'C:\XXX.bak'
WITH FILE = 1, replace
GO
Run Code Online (Sandbox Code Playgroud)
有时 .bak 文件已损坏(不是数据损坏)。
我想知道是否有一种方法可以检查文件是否未损坏,然后进行恢复,否则不会。我尝试在恢复验证后使用@@rowcount,但效果不好。
RESTORE VERIFYONLY
FROM DISK = 'C:\xxx.bak'
if @@ROWCOUNT !=0
print 'false'
else
print 'good'
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
谢谢。
sql-server-2008 sql-server t-sql sql-server-2008-r2 sql-server-2014
我正在尝试运行基本的 T-SQL 脚本
DECLARE @temptable TABLE(
abilityTypeId BIGINT NOT NULL,
companyId BIGINT NOT NULL
);
INSERT INTO @temptable(abilityTypeId, companyId)
VALUES (1, 2);
SELECT * FROM @temptable;
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
SQL 错误 [1087] [S0002]:必须声明表变量“@temptable”。必须声明表变量“@temptable”。
MERGE INTO也不工作。是否可以在 Linux 上实现此功能,还是必须使用 Visual Studio 才能实现此功能?
我有一个项目数据库,它维护来自不同环境(开发、测试、生产、predprod...)的不同数据库,我需要检查是否AUTO_CREATE_STATISTICS并AUTO_UPDATE_STATISTICSis设置为OFF/ON针对每个数据库以及是否将OFF其更改为ON.
ALTER DATABASE DB
SET AUTO_CREATE_STATISTICS ON
ALTER DATABASE DB
SET AUTO_UPDATE_STATISTICS ON
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在尝试根据参数从表中获取数据,
Declare @Loadtype varchar(10) = 'A'
Select *
from TableA (if @Loadtype = 'A')
Select *
from TableB (if @Loadtype = 'B')
Run Code Online (Sandbox Code Playgroud)
不知道我怎么能做到这一点。
非常感谢,乌代
您将如何保留数据库中所有表的每个值的完整历史记录,可以使用特定日期(对于所有表的每一列)进行查询?我的意思是:人们只需要指定一个日期,该日期的值是“活动”或“有效”。
以一种愚蠢的方式,我会在每个表中添加一个“有效期开始日期”列。而不是复制每个值,我只会复制更改的值,并将所有其他列设置为 NULL。然而,这个解决方案真的很糟糕,因为它使查询复杂化,即使它占用的空间更少。
是否有一种特定的技术(我在 Microsoft 世界中)可以做到这一点,或者有一种特定的方法来为数据库建模来做到这一点(除了为每个表的每一列创建一个表)?
我想提一下,我不是 DBA 而是开发人员。赞!赞!