我想在 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)
正如托马斯所说,我还更新了存储过程。
当谈到在 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) 我有一个查询,它根据一个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)
这会导致错误转换nvarchar为bigint.
如何将varchar值转换为 atimestamp而不是相反?
我对 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 向前启动(...是的,仍然有一些古老的版本...)
任何人都可以帮我找到合适的查询来实现这一目标吗?
我正在使用的数据库/表将其所有日期值保存为日期时间(没有时区)。
如何找出该日期所在的时区?
例如,中欧夏令时 (+02) 从 2015 年 3 月 29 日开始,而之前的冬季时间 (+01) 从 2014 年 10 月 26 日开始。
假设我看到的日期是2014-11-06,是否有一个函数可以用来检查它属于哪个时区?
注意,我知道时区变化时会有一些边缘情况
如果需要的话,我对一些大的CASE WHEN语句感到满意,但当然更愿意使用一些系统函数。
我想让一列唯一,但前提是不同的列是特定值。
考虑下表:
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 …
我有一个简单的 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) 我正在尝试为具有复合键的表创建删除语句。
我想创建类似的东西:
DELETE
FROM
table_example1
WHERE
COLUMN1, COLUMN2
IN
(SELECT COLUMN1, COLUMN2 FROM table_example2
WHERE
COLUMN_DATETIME > @Period);
Run Code Online (Sandbox Code Playgroud)
在脑海中只有的组合保持COLUMN1和COLUMN2是独一无二的,在自己的每一列不是唯一的。
我似乎无法理解我将如何实际执行此操作。
我为我的 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) 我有一个 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 ×10
t-sql ×10
constraint ×1
cursors ×1
datetime ×1
delete ×1
logins ×1
performance ×1
sql-standard ×1