标签: t-sql

T-SQL 基于标识列插入值

是否可以有一个基于 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)

database-design sql-server dml t-sql

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

SQL Server 是否记录存储过程失败?

如何在 SQL Server Management Studio 2008 中查看给定时间范围内的存储过程错误列表?

sql-server-2008 sql-server t-sql

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

T-SQL CHANGETABLE 如何拥有带有文字表名称的参数

我可以将文字表名称传递到内置函数中CHANGETABLE。我想知道这是如何完成的以及是否可以在我自己的存储过程/内联函数中完成。

在此之上。如果可以先将其传递给文字常量,然后将其传递给函数,这样我就可以获得表 ID,而不必在两个地方指定表名称。

提前致谢。

sql-server t-sql

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

如何查找正在运行的作业的会话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_idvarbinary但没有产生任何结果

;with JobDetails as
(
select Job_Id = left(intr1,charindex(':',intr1)-1), …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

按不间断日期对行进行分组

我想以这样的方式返回数据,即如果代码具有连续的活动日期和结束日期,则数据应给出最小活动日期和最大结束日期,但如果代码已停止,则应显示两个日期

例如桌子

+----+------+---------------+------------+
|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)

sql-server t-sql sql-server-2012 gaps-and-islands

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

如何仅在良好的情况下恢复 .bak

我正在使用 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

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

T-SQL 不适用于 Linux 上的 DBeaver

我正在尝试运行基本的 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 才能实现此功能?

linux t-sql dbeaver

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

如何检查数据库是否启用了 AUTO_CREATE_STATISTICS/AUTO_UPDATE_STATISTICS

我有一个项目数据库,它维护来自不同环境(开发、测试、生产、predprod...)的不同数据库,我需要检查是否AUTO_CREATE_STATISTICSAUTO_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)

我怎样才能做到这一点?

sql-server t-sql sql-server-2017

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

根据参数选择表名

我正在尝试根据参数从表中获取数据,

Declare @Loadtype varchar(10) = 'A'

Select *
from TableA (if  @Loadtype = 'A')

Select *
from TableB (if  @Loadtype = 'B')
Run Code Online (Sandbox Code Playgroud)

不知道我怎么能做到这一点。

非常感谢,乌代

sql-server t-sql

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

保留每个表中每个值的完整历史记录

您将如何保留数据库中所有表的每个值的完整历史记录,可以使用特定日期(对于所有表的每一列)进行查询?我的意思是:人们只需要指定一个日期,该日期的值是“活动”或“有效”。

以一种愚蠢的方式,我会在每个表中添加一个“有效期开始日期”列。而不是复制每个值,我只会复制更改的值,并将所有其他列设置为 NULL。然而,这个解决方案真的很糟糕,因为它使查询复杂化,即使它占用的空间更少。

是否有一种特定的技术(我在 Microsoft 世界中)可以做到这一点,或者有一种特定的方法来为数据库建模来做到这一点(除了为每个表的每一列创建一个表)?

我想提一下,我不是 DBA 而是开发人员。赞!赞!

database-design sql-server t-sql

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