我才发现, 通过纯粹的光彩意外的是,SQL Server 允许您创建没有任何名称的变量、参数、表变量、临时表(本地和全局)和临时存储过程(本地和全局)!好吧,至少不是我认为的名字。意思是,您可以指定DECLARE @ INT = 5;并且这是有效的 T-SQL:它执行时没有错误,甚至没有在 SSMS 中用红色波浪线下划线标记(本问题末尾显示了完整示例列表的代码)。
鉴于数据库标识符的 MSDN 页面指出(强调我的):
有两类标识符:
常规标识符
...
分隔标识符
... 常规标识符和分隔标识符都必须包含1 到128 个字符。对于本地临时表,标识符最多可以有 116 个字符。
这当然看起来不像预期的行为,我最初认为这是一个缺陷(不会导致任何错误,但似乎不是“正确”的行为)并提交了一个连接错误:参数、变量和临时表和过程名称/标识符可以为空。
然而,同一个 MSDN 页面还指出:
常规标识符规则
变量、函数和存储过程的名称必须符合以下 Transact-SQL 标识符规则。
第一个字符必须是以下字符之一:
- Unicode 标准 3.2 定义的字母。字母的 Unicode 定义包括从 a 到 z、从 A 到 Z 的拉丁字符,以及来自其他语言的字母字符。
下划线 (_)、at 符号 (@) 或数字符号 (#)。
标识符开头的某些符号在 SQL Server 中具有特殊含义。以 at 符号开头的常规标识符始终表示局部变量或参数,不能用作任何其他类型对象的名称。以数字符号开头的标识符表示临时表或过程。以双数字符号 (##) 开头的标识符表示全局临时对象。尽管可以使用数字符号或双数字符号字符作为其他类型对象的名称的开头,但我们不推荐这种做法。
因此,可以解释为,名称的 1 个字符的最低要求(从显示“1 到 128 …
我是数据库的新手,事实上,我是编程的新手。我想创建一个函数或者一个存储过程(如果它有效)来为用户表的一列插入/创建默认值。在这个表中,每个注册用户都应该被分配一个userId like K16060600,格式为Kyymmddxx,其中
K对于每个userId都是常数,yy代表年份(例如162016 年),mm 代表月份,dd 代表白天,xx 是一个 00 到 99 的数字,每当添加新行/用户时,它应该从 00 递增。我怎样才能做到这一点?
我使用的是 Visual Studio 2012 和 SQL Server 2012。
This is a simple one but I can't seem to figure it out.
I have two parameters, 1 and 2. If one parameter is passed a null value, use the other parameter in there WHERE clause.
Ex:
SELECT ...
WHERE CASE
WHEN @Parameter1 IS NULL
THEN Field2 = @Parameter2
WHEN @Parameter2 IS NULL
THEN Field1 = @Parameter1
END
Run Code Online (Sandbox Code Playgroud)
I know this is something simple or maybe I'm using my logic wrong. Any help or direction is appreciated.
我正在执行下面的查询,但我遇到了问题。
注意:SQL 2008 R2 和 SQL 2014 在 Win 2008 R2 和 Win 2012 R2 上使用两个差异服务帐户运行。TCP 端口、防火墙端口都与远程连接一起启用,我能够在本地机器上执行代码(例如:如果我连接到 SQL 2008 R2 机器并在 SQL 2008 R2 上执行成功,如果我连接到 SQL 2014 机器成功在 SQL 2014 上的 SSMS 上。问题仅在我连接到 SQL 2008 R2 并在 SQL 2014 上执行时出现。当我删除注释部分时,我能够使用 SQLCMD 成功执行代码。)我不知道这有任何兼容性问题案件。
Msg 121, Level 20, State 0, Line 0
从服务器接收结果时出现传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。)
但是当我删除注释部分并执行查询时,它在几秒钟内成功运行。请让我知道评论部分有什么问题。我在下面粘贴了 T-SQL 查询。
/********************************************************************************
* Summary: Creates source database schema for BCP Import. Only created PK on the tables
* No other constraints are replicated
* …Run Code Online (Sandbox Code Playgroud) 我有XML 结构,它是我的存储过程的输入参数。它包含带有& 的元素(在 XML 中转义)。当我提取该元素以VARCHAR接收& 时,它不是有效的 XML 字符。在再次转换为 XML 之前,我需要对其进行转义。如何做到这一点没有REPLACE?
我有以下文字:param1=xyz¶2=dasdasdfdas¶m3。它是查询字符串的一部分。我将其转换XML并作为 XML 结构的一部分发送:
<zzz xmlns="http://example.com">
<aaa>aaa</aaa>
<bbb>param1=xyz&para2=dasdasdfdas&param3</bbb>
</zzz>
Run Code Online (Sandbox Code Playgroud)
在存储过程中,我需要提取它。我这样做:
ISNULL(NULLIF(LTRIM(RTRIM(@XMLInput.value('declare default element namespace "http://example.com"; (zzz/bbb)[1]', 'NVARCHAR(250)'))), ''), '');
Run Code Online (Sandbox Code Playgroud)
之后,该值包含普通文本(& -s 未转义 - &)。
经过一些处理后,我需要将该字符串放入其他 XML 中。我做:
CAST( ... AS XML);
因为& -s 没有转义,所以我出错了。
当有人这样做时,我正在我们的一台测试服务器上运行跟踪:
我可以在跟踪中捕获的查询之一是:
declare @UserOption int
select @UserOption=convert(int, c.value) from sys.configurations c where c.name='user options'
SELECT
CAST(@UserOption & 1 AS bit) AS [DisableDefaultConstraintCheck],
CAST(@UserOption & 2 AS bit) AS [ImplicitTransactions],
CAST(@UserOption & 4 AS bit) AS [CursorCloseOnCommit],
CAST(@UserOption & 8 AS bit) AS [AnsiWarnings],
CAST(@UserOption & 16 AS bit) AS [AnsiPadding],
CAST(@UserOption & 32 AS bit) AS [AnsiNulls],
CAST(@UserOption & 64 AS bit) AS [AbortOnArithmeticErrors],
CAST(@UserOption & 128 AS bit) AS [IgnoreArithmeticErrors],
CAST(@UserOption & 256 AS bit) AS [QuotedIdentifier],
CAST(@UserOption & …Run Code Online (Sandbox Code Playgroud) sql-server t-sql sql-server-2014 operator bitwise-comparison
我知道如何编写带有输出参数的存储过程。但我不知道为什么我会使用它而不是仅仅使用一个简单的SELECT语句。一个普通的存储过程仍然可以在网格中返回一个输出(见下面的例子)。
任何人都可以举一个真实的例子,我可以在没有输出参数的情况下使用带有输出参数的 SP 而不是 SP 吗?
-- Using output parameter
SELECT @var = COUNT(*) FROM table1 WHERE gender = @gender...
-- Without output parameter
SELECT COUNT(*) FROM table WHERE gender = @gender...
Run Code Online (Sandbox Code Playgroud) 我知道有几篇关于从日期时间列中剥离时间部分的帖子。并且每个人都建议 DATEADD 和 DATEDIFF 方法对性能来说是最好的,个人不应该采用将日期值转换为 varchar 的过程。所以我想使用下面的函数,但我不明白为什么我收到的结果仍然具有与其关联的时间值,尽管时间全为零?
提供更多关于为什么我想了解这个结果的信息。我有一个存储过程,我希望指定以下内容:
DECLARE @DateShippedBegin DATETIME
DECLARE @DateShippedEnd DATETIME
SET @DateShippedBegin = dateadd(dd, datediff(dd, 0, @DateShipped), 0)
SET @DateShippedEnd = dateadd(dd, datediff(dd, 0, @DateShipped) + 1, 0)
WHERE O.date_shipped >= @DateShippedBegin and O.date_shipped < @DateShippedEnd
Run Code Online (Sandbox Code Playgroud)
但是当我使用基本日期格式执行该程序时,我没有收到任何结果,因此我试图了解我的程序采用的最佳概念。
Select DATEADD(dd, DATEDIFF(dd, 0, Getdate()), 0) from orders where order_no =
'1247401'
Run Code Online (Sandbox Code Playgroud)
起始日期值示例:
2017-05-010 08:40:18.287
Run Code Online (Sandbox Code Playgroud)
查询结果示例:
2017-05-10 00:00:00.000
Run Code Online (Sandbox Code Playgroud) 免责声明:这个问题最初是在 SO 上被问到的,但在那里并没有太大的吸引力,所以我在这里尝试,希望它对 DBA 更有趣......
我们正在开发一个电子商务系统,在该系统中我们汇总来自不同卖家的订单。正如您可以轻松想象的那样,我们有一个Order包含所有卖家订单数据的表格。每个卖家都有一个唯一的AccountID,它是Order表中的外键。
我们希望为进入系统的每个订单生成一个订单号,以便对于给定的卖家(和给定AccountID),这些订单号正在创建一个序列(第一个订单获得 1,然后是 2,然后是 3 等)。
我们已经尝试了几种解决方案,但它们有我们想要避免的缺点。所有这些都在触发器中:
ALTER TRIGGER [dbo].[Trigger_Order_UpdateAccountOrderNumber]
ON [dbo].[Order]
AFTER INSERT
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
我们的解决方案 1是:
UPDATE
[Order]
SET
AccountOrderNumber = o.AccountOrderNumber
FROM
(
SELECT
OrderID,
AccountOrderNumber =
ISNULL((SELECT TOP 1 AccountOrderNumber FROM [Order] WHERE AccountID = i.AccountID ORDER BY AccountOrderNumber DESC), 1) +
(ROW_NUMBER() OVER (PARTITION BY i.AccountID ORDER BY i.OrderID))
FROM
inserted AS i
) AS o
WHERE [Order].OrderID …Run Code Online (Sandbox Code Playgroud) 我使用服务器端散列来传输密码,然后在数据库中运行 PBKDF2 来存储散列密码 + 盐组合。
散列nvarchar(max)和@variable持有相同值的HASHBYTES()函数会产生不同的结果。
DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'
SELECT HASHBYTES('SHA1', 'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT,
HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
NVARCHAR_INPUT | VARIABLE_INPUT
0xA03BEF0E3EC96CC7C413C6646D3FEC6174DA530F | 0x74B55C42E1E0AB5C5CDF10B28567590B240355C3
Run Code Online (Sandbox Code Playgroud)
这是 SQL Server 2012。这个特定的数据库正在运行 SQL Server Express,所以我也很好奇这个问题是否与版本无关。