标签: t-sql

where 子句中的存储过程空参数

我想在 where 子句中使用一个参数,仅当它的值由强类型数据集提供时,这是我目前正在尝试的,当我提供时我得到正确的结果,parameter3而当我不提供它的值时没有结果。

我想要的是,当我没有为 提供值时parameter3,它不应该在查询中使用它,因为它的值为空,我想查看查询中的所有结果,而不是where Paramerter3 = null

ALTER procedure [dbo].[GetData]
(
    @Parameter1 varchar(256),
    @Parameter2 varchar(256),
    @Parameter3 int = null
)
AS

SELECT
    *
FROM
    Table1
WHERE
    Table1.URL LIKE '%' + @Parameter1 + '%' 
    AND Table1.ID = @Parameter2
    AND (@Parameter3 IS NULL OR Table1.ID2 = @Parameter3)
ORDER BY
    Table1.Title
Run Code Online (Sandbox Code Playgroud)

编辑:我试过托马斯的回答并像这样执行:

EXEC @return_value = [dbo].[GetData]
                              @Parameter1 = N'asda',
                              @Parameter2 = N'asda',
                              @Parameter3 = null

SELECT  'Return Value' = @return_value
GO
Run Code Online (Sandbox Code Playgroud)

正如托马斯所说,我还更新了存储过程。

sql-server t-sql sql-server-2012

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

为什么选择顶级查询和临时表而不是循环游标?

当谈到在 T-SQL 中循环遍历大量数据时,我在 Internet 上看到的大多数示例都使用这样的模式:

declare @someVariable int
declare @remainingRows int

select someColumn from someTables into #someTempTable

select @remainingRows = count(*) from #someTempTable
while @remainingRows > 0 begin

    select top 1 @someVariable = someColumn from #someTempTable

    -- Do stuff

    delete top 1 from #someTempTable

    select @remainingRows = count(*) from #someTempTable
end
Run Code Online (Sandbox Code Playgroud)

这似乎比使用这样的游标的示例更常见:

declare @someVariable int

select someColumn from someTables into #someTempTable

declare @someCursor cursor for select someColumn from #someTempTable
open @someCursor
fetch next @someVariable from @someCursor

while @@fetch_status = 0 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql cursors

6
推荐指数
1
解决办法
8520
查看次数

我怎样才能使这个查询 sargable?

我有一个查询,它根据一个timestamp值连接两个表(不要问)。

其中一个表将数据存储在具有Timestamp数据类型的列中。另一个将其存储为varchar.

以前,查询将timestamp列转换varchar为用于连接的 a。据我了解,这不是 sargable,所以我想做相反的事情。(timestamp表要大得多,效率更是一个问题)。

SELECT * 
FROM TABLE1 
INNER JOIN TABLE2 
    ON UPPER(master.dbo.fn_sqlvarbasetostr(cast(TimestampColumn as binary(8))))
       = VARCHARTIMESTAMPCOLUMN
Run Code Online (Sandbox Code Playgroud)

我试过了:

CONVERT(ROWVERSION, N'0x0000000003306BDD')
Run Code Online (Sandbox Code Playgroud)

没有错误,但表上没有匹配项(当一行肯定存在时)。

CONVERT(ROWVERSION, CAST(N'0x0000000003306BDD' as bigint))
Run Code Online (Sandbox Code Playgroud)

这会导致错误转换nvarcharbigint.

如何将varchar值转换为 atimestamp而不是相反?

sql-server t-sql type-conversion sql-server-2014

6
推荐指数
1
解决办法
733
查看次数

如何将默认数据库更改为所有登录名?

我对 SQL Server 有点陌生,我正在尝试编写 Microsoft SQL Server (2005-2014) 安装后活动的脚本,但我在更改登录时遇到了一些困难。公司政策规定没有登录应该默认使用 master 数据库,因此我的计划是识别所有默认使用 master 的登录并将 master 更改为 tempdb。

可以使用这样的查询更改单次登录:

ALTER LOGIN [sa] WITH DEFAULT_DATABASE = tempdb
Run Code Online (Sandbox Code Playgroud)

试图在所有登录中实现这一点(不知道它们的数量和名称),我知道我很天真,希望这样的事情会起作用(但不得不尝试):

UPDATE master..syslogins
SET dbname = 'tempdb'
WHERE dbname = 'master'
Run Code Online (Sandbox Code Playgroud)

显然输出是一个错误(逻辑上):

Ad hoc updates to system catalogs are not allowed.

SQL Server 处于 MIX 身份验证模式,因此几乎所有内容都可以登录 - SQL 登录、Windows 本地或域用户或组(不确定这是否会对解决方案产生任何影响)。解决方案应该与版本无关,但是假设从 SQL Server 2005 向前启动(...是的,仍然有一些古老的版本...)

任何人都可以帮我找到合适的查询来实现这一目标吗?

sql-server t-sql logins

6
推荐指数
1
解决办法
7221
查看次数

如何检查给定日期时间的时区?

我正在使用的数据库/表将其所有日期值保存为日期时间(没有时区)。

如何找出该日期所在的时区?

例如,中欧夏令时 (+02) 从 2015 年 3 月 29 日开始,而之前的冬季时间 (+01) 从 2014 年 10 月 26 日开始。

假设我看到的日期是2014-11-06,是否有一个函数可以用来检查它属于哪个时区?

注意,我知道时区变化时会有一些边缘情况

如果需要的话,我对一些大的CASE WHEN语句感到满意,但当然更愿意使用一些系统函数。

sql-server t-sql datetime

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

根据另一列值强制一列唯一

我想让一列唯一,但前提是不同的列是特定值。

考虑下表:

CREATE TABLE [SampleTable]
(
     [Id] INTEGER NOT NULL IDENTITY(1,1)
    ,CONSTRAINT [PK_SampleTable]
        PRIMARY KEY ([Id])

    ,[Code]      NVARCHAR(255) NOT NULL
    ,[Deleted]   BIT           NOT NULL DEFAULT 0
    ,[CreatedOn] DATETIME      NOT NULL DEFAULT GETDATE()
);
Run Code Online (Sandbox Code Playgroud)

目的是可以通过将[Deleted]列设置为 1来“删除”项目。

我想要的是将[Code]列强制为唯一,但仅在未删除的行中

在数据库级别强制执行数据正确性通常是我的强烈偏好。但是,我过去经常使用这种模式,但一直不确定是否可以在数据库级别强制实施这种约束。截止日期的压力是什么,我从来没有费心去发现。所以我一直只是在应用程序级别强制执行它们。

如果有办法做到这一点,我真的很想知道它是什么。

需要明确的是,我不能只使用组合唯一约束,因为我需要能够支持以下数据:

    [ID]   [Code]   [Deleted]  [CreatedOn]
=====================================================================
     1     'ABC'    1          Ages ago
     2     'ABC'    1          A while ago
     3     'ABC'    1          Quite recently, actually
     4     'ABC'    0          Just a moment ago!
Run Code Online (Sandbox Code Playgroud)

组合的唯一约束将不起作用,因为就我而言,具有相同代码的三个不同的“已删除”条目是有效的。

我问这个问题是因为最近在集成来自第三方应用程序的数据时,“在应用程序级别强制执行”策略让我感到很恼火。如果数据库直接拒绝错误的集成数据会很好,因为在集成发生之前修复它比在错误发生后清理数据容易得多。

我正在使用 SQL Server 2008 …

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

6
推荐指数
1
解决办法
9327
查看次数

TSQL SVF 调用中的障碍

我有一个简单的 Products 数据表,其中包含 100k 条记录(仅生成一些随机数据):

set nocount on

create table dbo.temp_Products
(
    [ProductID] int,
    [Type] tinyint,
    [Price] float,
    [Weight] float 
)

declare @rowcnt int = 0
while (@rowcnt <= 100000)
begin
    insert into dbo.temp_Products
    select @rowcnt, 1+rand()*4, 1+rand()*100, 1+rand()*10

    set @rowcnt = @rowcnt + 1
end
Run Code Online (Sandbox Code Playgroud)

以及进行简单逻辑计算的标量值函数:

create function dbo.usvf_CalculateShipping
(
    @PricePerKG float = 1,
    @Type tinyint,
    @WeightInKG float = 1
)
returns float
as
begin

    return  /*get the appropriate factor to apply*/
            case
                when @Type = 1 then 0.1 …
Run Code Online (Sandbox Code Playgroud)

performance sql-server t-sql query-performance

6
推荐指数
1
解决办法
329
查看次数

使用复合键删除

我正在尝试为具有复合键的表创建删除语句。

我想创建类似的东西:

DELETE 
FROM 
    table_example1
WHERE
    COLUMN1, COLUMN2
    IN
    (SELECT COLUMN1, COLUMN2 FROM table_example2
    WHERE
        COLUMN_DATETIME > @Period);
Run Code Online (Sandbox Code Playgroud)

在脑海中只有的组合保持COLUMN1COLUMN2是独一无二的,在自己的每一列不是唯一的。

我似乎无法理解我将如何实际执行此操作。

sql-server delete t-sql

6
推荐指数
1
解决办法
7986
查看次数

在数据库级别设置 ANSI_NULLS 与在表级别设置它

我为我的 sql server 2008 R2 生成了仅模式脚本,这是其中的一部分:-

USE [master]
GO
/****** Object:  Database [****]    Script Date: 03/25/2015 12:17:09 ******/
CREATE DATABASE [****] ON  PRIMARY 
( NAME = N'TMS', FILENAME = N'D:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\****.mdf' , SIZE = 11264KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = N'TMS_log', FILENAME = N'L:\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\****.ldf' , SIZE = 4672KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [****] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) …
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
1
解决办法
5729
查看次数

检测两个时间段是否重叠

我有一个 HR 系统,我需要检测新的请假(休假)请求是否与现有的请求冲突。我已经根据一整天的时间编写了代码来做到这一点;我现在需要做基于半天的比较。

这是我的数据结构(和数据格式)。我正在使用 SQL Server 2008 R2。

StartDate     (datetime)
EndDate       (datetime)
Run Code Online (Sandbox Code Playgroud)

以下 2 个变量显示用户是休息半天还是一整天。列出并解释了每个选项的选项。

StartDateAMPM (int) 0=All Day (StartDate may or may not be the same as the EndDate), 
                    1=AM, (User is out of the office only in the morning)
                    2=PM  (User is out of the office only in the afternoon)

EndDateAMPM   (int) 0="All Day" / "half day" / "StartDate = EndDate", 
                    1=AM (The user is off for the morning only)

**NOTE This cannot be PM (as you cannot …
Run Code Online (Sandbox Code Playgroud)

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

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