标签: t-sql

为什么`SELECT @@IDENTITY` 返回一个小数?

我正在使用Dapper对来自 ASP.NET MVC 3 (.NET 4.0) 应用程序的 SQL Server 2008 R2 Express 实例执行以下查询。

INSERT INTO Customers (
         Type, Name, Address, ContactName, 
         ContactNumber, ContactEmail, Supplier)
VALUES (
         @Type, @Name, @Address, @ContactName, 
         @ContactNumber, @ContactEmail, @Supplier)

SELECT @@IDENTITY
Run Code Online (Sandbox Code Playgroud)

对 的调用connection.Query<int>(sql, ...)正在引发无效的强制转换异常。我已经调试了它,它是在 Dapper 调用GetValue返回的SqlDataReader.

的返回类型GetValueObject,在调试器中检查它显示它是一个装箱十进制。

如果我将选择更改为SELECT CAST(@@IDENTITY as int),则 GetValue 的返回是一个装箱的 int 并且不会引发异常。

Id 列绝对是 int 类型;为什么会SELECT @@IDENTITY返回一个小数?

一些附加信息:

  • 数据库是全新的。
  • 客户表是我添加到其中的唯一对象。数据库中没有其他(用户)表、视图、触发器或存储过程。
  • 数据库中有 10 行,Id 为 1,2,3,4,5,6,7,8,9,10(即该列不超出 int …

sql-server ado.net t-sql

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

将结果限制在前 2 个排名行

在SQL Server 2008中,我使用RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)与返回的数据集RANK。但是我每个分区有数百条记录,所以我将从等级 1、2、3......999 中获取值。但我只想RANKs在每个PARTITION.

例子:

ID   Name    Score    Subject
1    Joe      100      Math
2    Jim      99       Math
3    Tim      98       Math
4    Joe      99       History
5    Jim      100      History
6    Tim      89       History
7    Joe      80       Geography
8    Tim      100      Geography
9    Jim      99       Geography
Run Code Online (Sandbox Code Playgroud)

我希望结果是:

SELECT Subject, Name, RANK() OVER (PARTITION BY Subject ORDER BY Score DESC)
FROM Table
Run Code Online (Sandbox Code Playgroud)
Subject        Name      Rank …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server t-sql window-functions rank

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

ON 子句的位置实际上是什么意思?

正常的JOIN ... ON ...语法是众所周知的。但也可以将ON子句JOIN与其对应的分开放置。这在实践中很少见,在教程中找不到,我也没有找到任何网络资源甚至提到这是可能的。

这是一个可以玩的脚本:

SELECT *
INTO #widgets1
FROM (VALUES (1), (2), (3)) x(WidgetID)


SELECT *
INTO #widgets2
FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue)

SELECT *
INTO #widgetProperties
FROM (VALUES
    (1, 'a'), (1, 'b'),
    (2, 'a'), (2, 'b'))
x(WidgetID, PropertyName)


--q1
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 ON w2.WidgetID = w1.WidgetID
LEFT JOIN #widgetProperties wp ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

23
推荐指数
2
解决办法
2283
查看次数

对于大字符串,“+”比“CONCAT”慢吗?

我一直认为CONCAT函数实际上是+(字符串连接)的包装,并带有一些额外的检查,以使我们的生活更轻松。

我还没有找到任何关于这些功能是如何实现的内部细节。至于性能,当数据在循环中连接时,调用似乎会产生开销CONCAT(这似乎很正常,因为有额外的 NULL 句柄)。

几天前,一位开发人员修改了一些字符串连接代码(从+到 ,CONCAT)因为不喜欢语法并告诉我它变得更快。

为了检查情况,我使用了以下代码:

DECLARE @V1 NVARCHAR(MAX)
       ,@V2 NVARCHAR(MAX)
       ,@V3 NVARCHAR(MAX);

DECLARE @R NVARCHAR(MAX);

SELECT  @V1 = REPLICATE(CAST('V1' AS NVARCHAR(MAX)), 50000000)
       ,@V2 = REPLICATE(CAST('V2' AS NVARCHAR(MAX)), 50000000)
       ,@V3 = REPLICATE(CAST('V3' AS NVARCHAR(MAX)), 50000000);
Run Code Online (Sandbox Code Playgroud)

这是变体一:

SELECT @R = CAST('' AS NVARCHAR(MAX)) + '{some small text}' + ISNULL(@V1, '{}') + ISNULL(@V2, '{}') + ISNULL(@V3, '{}'); 
SELECT LEN(@R); -- 1200000017
Run Code Online (Sandbox Code Playgroud)

这是变体二:

SELECT @R = CONCAT('{some small text}',ISNULL(@V1, '{}'), ISNULL(@V2, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql concat standard-edition sql-server-2022

23
推荐指数
1
解决办法
4094
查看次数

在 HashBytes 函数中选择正确的算法

我们需要创建 nvarchar 数据的哈希值以进行比较。T-SQL 中有多种哈希算法可用,但在这种情况下,最好选择哪一种?

我们希望确保两个不同的 nvarchar 值具有重复哈希值的风险最小。根据我对互联网的研究,MD5 似乎是最好的。那正确吗?MSDN 告诉我们(下面的链接)有关可用算法的信息,但没有说明哪一种适用于什么条件?

哈希字节 (Transact-SQL)

我们需要在两个 nvarchar(max) 列上连接两个表。可以想象,执行查询需要很长时间。我们认为最好保留每个 nvarchar(max) 数据的散列值并对散列值进行连接,而不是 nvarchar(max) 值是 blob。问题是哪种哈希算法提供了唯一性,这样我们就不会遇到一个哈希值对应多个 nvarchar(max) 的风险。

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

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

有没有办法在TSQL中生成表创建脚本?

有没有办法纯粹在 T-SQL 中从现有表生成创建脚本(即不使用 SMO,因为 T-SQL 无法访问 SMO)。假设一个存储过程接收一个表名并返回一个包含给定表的创建脚本的字符串?

现在让我描述一下我面临的情况,因为可能有不同的方法来解决这个问题。我有一个包含几十个数据库的实例。这些数据库都具有相同的架构、相同的表、索引等。它们是作为第三方软件安装的一部分创建的。我需要有一种与他们合作的方法,以便我可以以特别的方式从他们那里收集数据。dba.se 的好人已经在这里帮助了我如何在不同的数据库中创建触发器?

目前我需要找到一种方法来从所有数据库的表中进行选择。我已将所有数据库名称记录到一个名为的表中,Databasees并编写了以下脚本来对所有数据库执行 select 语句:

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp

select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) = 
  N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'

DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0

DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int

SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No

WHILE @DatabaseIDToHandle …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql t-sql sql-server-2012

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

INSERT 语句中的行值表达式的数量超过了 1000 个行值的最大允许数量

一个INSERT INTO脚本编写如下。

INSERT INTO tableName (Column1, Column2,....) VALUES (value1, Value2,...), (value1, Value2,...),....
Run Code Online (Sandbox Code Playgroud)

以下是我们在解析上面的插入语句时面临的错误

消息 10738,级别 15,状态 1,第 1007 行 INSERT 语句中的行值表达式的数量超过了 1000 个行值的最大允许数量。

我的简单问题是,我们可以更改 1000 个值限制吗?

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

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

SQL Server 注入 - 26 个字符中有多少损坏?

我正在测试针对 SQL Server 数据库的注入攻击的弹性。

db 中的所有表名都是小写的,并且排序规则区分大小写,Latin1_General_CS_AS

我可以发送的字符串强制为大写,长度最多为 26 个字符。所以我不能发送 DROP TABLE,因为表名将是大写的,因此该语句会由于排序规则而失败。

那么 - 我可以在 26 个字符中造成的最大伤害是多少?

编辑

我对参数化查询等都了如指掌——让我们想象一下,在这种情况下,开发构建要发送的查询的前端的人没有使用参数。

我也不想做任何邪恶的事情,这是由同一组织中的其他人构建的系统。

security sql-server t-sql

22
推荐指数
3
解决办法
8599
查看次数

我应该将 SET NOCOUNT ON 添加到我的所有触发器中吗?

这是你应该拥有的相当普遍的知识

SET NOCOUNT ON   
Run Code Online (Sandbox Code Playgroud)

默认在创建新存储过程时。

Microsoft 已在 2012 年更改了默认模板以包含此内容。我认为这对于触发器应该是相同的,但它并未包含在模板中。

这是故意的还是只是疏忽?

trigger sql-server t-sql

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

选择所有记录,如果连接存在则连接表A,如果不存在则连接表B

所以这是我的场景:

我正在为我的一个项目进行本地化,通常我会在 C# 代码中执行此操作,但是我想在 SQL 中执行更多此操作,因为我试图稍微增强我的 SQL。

环境:SQL Server 2014 Standard,C# (.NET 4.5.1)

注意:编程语言本身应该是无关紧要的,我只是为了完整性而包括它。

所以我在某种程度上完成了我想要的,但没有达到我想要的程度。JOIN除了基本的SQL之外,我已经有一段时间(至少一年)完成了任何 SQL ,这是一个相当复杂的JOIN.

这是数据库相关表的图表。(还有很多,但这部分不是必需的。)

数据库图表

图像中描述的所有关系在数据库中都是完整的 -PKFK约束都是设置和操作的。所描述的列都null不能。所有的表都有架构dbo

现在,我有一个查询几乎可以满足我的要求:也就是说,给定ANY Id ofSupportCategoriesANY Id of Languages,它将返回:

如果有合适的,正确的翻译是语言该字符串(即StringKeyId- >StringKeys.Id存在,并在LanguageStringTranslations StringKeyIdLanguageId以及StringTranslationId是否同时存在,那么它的负载StringTranslations.TextStringTranslationId

如果LanguageStringTranslations StringKeyIdLanguageIdStringTranslationId组合没有存在,那么它加载的StringKeys.Name值。该Languages.Id是给定的integer

我的查询,是否一团糟,如下:

SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

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