标签: t-sql

具有完整外部连接的 Where 子句

我可能只是设置我的查询完全不正确,但我需要返回的预期结果集是Nuestra B & Nosotros B因为它们分别属于日期范围。IE Nuestra Bfeeduedate >= '20160301' AND fj.feeduedate <='20160330'和 Nosotros Bfe.ViolationDate >= '20170601' AND fe.ViolationDate <= '20170606'它们就位。

但是,当我运行此查询以尝试返回结果时,我的结果集中返回了 0。

我的查询有什么问题?以下是示例数据和 DDL

    CREATE TABLE [dbo].[fei](
    [violatorsName] [varchar](500) NOT NULL,
    [violationNumber] [varchar](100) NOT NULL,
    [violationDate] [date] NOT NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[FJI](
    [violatorsName] [varchar](500) NOT NULL,
    [VIN] [varchar](100) NOT NULL,
    [vfees1] [float] NOT NULL,
    [vfees2] [float] NOT NULL,
    [vfees3] [float] NOT NULL,
    [vfees4] [float] NOT NULL,
    [vfees5] [float] NOT NULL,
    [vfees6] …
Run Code Online (Sandbox Code Playgroud)

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

3
推荐指数
1
解决办法
2132
查看次数

链接服务器:如何在远程表上设置排他锁?

正如我发现的那样,您可以在事务中对所需的表设置锁定:

begin tran
    select 1 from myTable
        with (tablock /*or tablockx to block even reads from table*/, holdlock) 
    -- do your work
commit tran
Run Code Online (Sandbox Code Playgroud)

但是当我在链接服务器表上运行此代码时,该表仍然可以从链接服务器内访问!为什么?我如何像我的例子一样在这个远程表上设置锁?

sql-server t-sql linked-server

3
推荐指数
1
解决办法
617
查看次数

在 Kill Command 收到间歇性错误时要检查什么

我有一个 C# 计划任务,它每晚运行,并包含一个 kill 命令来删除现有数据库,以便可以重新创建它。它大约每周随机生成一次此错误。

杀死数据库失败。用户无权更改数据库“Foo”、数据库不存在或数据库未处于允许访问检查的状态。杀死数据库失败。

使用的C#如下。

srv.KillAllProcesses;
srv.KillDatabase;
Run Code Online (Sandbox Code Playgroud)

所以我已经在尝试终止所有进程。在执行 kill 命令之前是否还有其他检查或命令可以确保它成功执行?这不可能是用户权限问题,因为该操作大部分时间都在工作,那么什么可能导致“未处于允许访问检查的状态”?

sql-server t-sql sql-server-2014

3
推荐指数
1
解决办法
117
查看次数

获取所有 CONVERT(datetime) 样式(格式)

我知道问这个问题有点愚蠢,但是否有 Transact-SQL 函数或任何返回所有CONVERT(datetime)样式(格式)的函数?类似的东西fnDateFormats将返回所有日期格式:

输出:

日期格式 | SQL代码
月/日/年 101

等等。

sql-server t-sql date-format

3
推荐指数
1
解决办法
2550
查看次数

如何仅使用 T-SQL 监视 SSMS 中的活动?

我使用以下语句来监视 SQL Server 中的活动(这是出自某本书)

SELECT 
    des.session_id ,
    des.status ,
    des.login_name ,
    des.[HOST_NAME] ,
    der.blocking_session_id ,
    DB_NAME(der.database_id) AS database_name ,
    der.command ,
    des.cpu_time ,
    des.reads ,
    des.writes ,
    dec.last_write ,
    des.[program_name] ,
    der.wait_type ,
    der.wait_time ,
    der.last_wait_type ,
    der.wait_resource ,
    CASE des.transaction_isolation_level
        WHEN 0 THEN 'Unspecified'
        WHEN 1 THEN 'ReadUncommitted'
        WHEN 2 THEN 'ReadCommitted'
        WHEN 3 THEN 'Repeatable'
        WHEN 4 THEN 'Serializable'
        WHEN 5 THEN 'Snapshot'
    END AS transaction_isolation_level ,
    OBJECT_NAME(dest.objectid, der.database_id) AS OBJECT_NAME ,
    SUBSTRING(dest.text, der.statement_start_offset / 2,
    ( CASE …
Run Code Online (Sandbox Code Playgroud)

sql-server ssms t-sql

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

删除非活动用户 - 如何防止作业和报告停止工作

我们组织中有几个 Microsoft SQL 服务器,以前的 DBA 没有对其中任何一个进行用户审查,因此有些服务器上充满了不活动的本地用户。我有一个查看他们上次登录日期的脚本:

SELECT MAX(login_time) AS [Last Login Time], login_name [Login]
FROM sys.dm_exec_sessions
GROUP BY login_name
ORDER BY [Login] ASC;
Run Code Online (Sandbox Code Playgroud)

但是我如何创建一个类似的脚本来列出用户所做的所有工作和报告,以便在我删除非活动用户时它们不会停止工作?从 Microsoft SQL Server 中删除用户时是否有任何最佳做法?

sql-server t-sql jobs

3
推荐指数
1
解决办法
224
查看次数

使用 T-SQL,是否可以拆分结果集或表,然后插入到两个不同的临时表中?

我有一张保存付款数据的表。我想将以拒绝状态结束的订单插入#tmp_Declined。然后,我想将最初被拒绝但在使用替代付款方式时获得授权的付款插入 #tmp_Authorized。

我可以使用 2 个 select into 语句来做到这一点,其中 where 子句略有不同,但使用相同的基表。

我考虑了一个类似下面的例子:

select *
into #tmp_Declined
from Payments

except

select *
from Payments 
where WasOrginallyDeclined = 1 
and MostRecentPaymentAccepted = 1 
Run Code Online (Sandbox Code Playgroud)

这种方法虽然仍然会在某个时间填充一个临时表。是否有保留字或查询“技巧”将插入#tmpA 中满足条件,然后插入#tmpB 中未插入#tmpA 中的任何内容?

我希望能够通过一个事务写入 2 个表。

sql-server t-sql except

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

WHERE 1 = 2 返回一行

任何想法,为什么以下查询中的第一个返回带有 -1,NULL 的行,尽管它有一个WHERE 1=2

只有当我将查询放入另一个子查询时,它才能正常工作(并返回一个空的结果集)。

在 Microsoft SQL Server 2014 和 2016 上测试

DECLARE @i INT = 1

SELECT @i i, MAX(sub.id) mid
  FROM (SELECT TOP(@i) x.id
          FROM (VALUES(1), (2), (3), (4)) x(id)
         WHERE x.id > 2 + @i
         ORDER BY x.id) sub
WHERE 1 = 2

SELECT s1.i, s1.mid
  FROM (
        SELECT @i i, MAX(sub.id) mid
          FROM (SELECT TOP(@i) x.id
                  FROM (VALUES(1), (2), (3), (4)) x(id)
                 WHERE x.id > 2 + @i
                 ORDER BY x.id) sub
       ) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014 sql-server-2016

3
推荐指数
1
解决办法
184
查看次数

使用“IN”语法添加计算列

我在 SQL Server 2008R2 中有一个查询,我想针对计算列运行该查询,而我又要对计算列进行索引 - 以加快速度。

该列现在是 int 类型。

我无法正确使用语法。

alter table dbo.tOutput Add StateNew as State IN (0, 10)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

Incorrect syntax near the keyword 'IN'.
Run Code Online (Sandbox Code Playgroud)

来自 C# 实体框架的查询应该稍后使用索引并且 - 很好 - 很快。

C#好像改成IN用法了,原来是这样的:

tOutput.Where(x => (x.State == 0) || (x.State == 10))
Run Code Online (Sandbox Code Playgroud)

生成的 SQL 读取

.. FROM tOutput WHERE State IN (0, 10) ..
Run Code Online (Sandbox Code Playgroud)

index sql-server t-sql computed-column

3
推荐指数
1
解决办法
271
查看次数

如何跨多个服务器/数据库检查我的 sp_Blitz/sp_WhoIsActive 版本?

我在我的 SSMS 中注册了一堆 SQL Server,有很多不同的 SQL 版本、版本和数据库兼容性。

我想看看是否所有这些服务器有任何sp_Blitzsp_WhoIsActive安装的存储过程,以及哪个版本它们。

我知道我可以右键单击我的注册服务器组并打开一个连接到组中所有服务器的查询窗口,但是有没有一种可靠的方法来检查我拥有哪些 SProc 和版本?

sql-server t-sql multi-server-admin sp-blitz

3
推荐指数
1
解决办法
462
查看次数