标签: t-sql

COUNT(*) 和 COUNT(*) OVER() 有什么区别

以下面的代码示例为例:

SELECT MaritalStatus,
       COUNT(*) AS CountResult
       COUNT(*) OVER() AS CountOverResult
       FROM (schema).(table)
       GROUP BY Marital Status
Run Code Online (Sandbox Code Playgroud)

COUNT(*) 返回所有行忽略空值对吗?

有什么作用COUNT(*) OVER()

这个问题是在练习考试中出现的,所以我没有要查询的数据。我一直在使用 Adventure Works 和这个网站http://www.sqlishard.com/Exercise来练习。

如果我输入一个查询

SELECT ID, COUNT(*) AS 'COUNT(*)' , COUNT(*) OVER() AS 'COUNT(*) OVER()'
FROM Customers
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)

进入练习站点,我得到 3794 行返回,其中一Count(*)列是 1,一Count(*) Over()列是总行数。我不明白这个模式(对不起)所以我来到了这里。

sql-server t-sql window-functions

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

以高可用性还原 SQL Server 2012 数据库

我有一个始终处于高可用性模式的数据库与不同实例上的另一个数据库同步。如何.bak使用将文件从文件还原到主数据库T-SQL

我是高可用性的新手,有人建议我需要先将数据库从高可用性中移除,然后才能进行还原,然后再次将其恢复为高可用性,但我不确定。

我希望我可以在AlwaysOn仍然启用的情况下直接恢复到主服务器,并且它会自动与辅助服务器同步。

sql-server t-sql restore sql-server-2012 availability-groups

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

我的计算机名称中的连字符导致 T-SQL 错误

我是一名开发人员,而不是一名 DBA(我很担心这是在展示)。我正在尝试在我的家用计算机(名为John-PC)上使用 SQL Server 2014 Express 运行 Report Builder 3.0,但无法运行我的报告。

我无意中创建的用户/登录组合user = John-PClogin = John-PC\John。当我尝试删除条目时:

Drop Login John-PC\John
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

“-”附近的语法不正确。

我认为问题在于我的计算机名称中的连字符。

  1. 有没有办法绕过语法错误?
  2. 是否有另一种更改或删除用户的方法(我尝试删除sys.server_principals但收到一个错误,我无法进行临时更改)。
  3. 我可以以某种方式给 Report Builder 一个新的用户名/登录名吗?
  4. 如果以上都不是,我可以将我的计算机名称更改为John_PC还是会产生许多我无法想象的其他问题?

sql-server t-sql sql-server-2014

13
推荐指数
2
解决办法
3684
查看次数

将逗号作为小数点分隔符的字符串数值转换为 NUMERIC(10, 2)

我有一个包含希腊格式数字的 varchar 列的 SQL 表(。作为千位分隔符,逗号作为小数点分隔符)

经典的转换

CONVERT(numeric(10,2),REPLACE([value],',','.'))
Run Code Online (Sandbox Code Playgroud)

不起作用,因为 . (千位分隔符)杀死转换

例如尝试

CONVERT(numeric(10,2),REPLACE('7.000,45',',','.'))
Run Code Online (Sandbox Code Playgroud)

我想将这些值转换为数字(10,2)

有关如何处理的任何建议?

sql-server t-sql type-conversion decimal string

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

在 SQL Server 中,有没有办法确定传递给正在执行的存储过程的参数的值

确定正在执行的存储过程的一种方法是使用“动态管理”方法,如下所示:

SELECT 
    sqlText.Text, req.* 
FROM 
    sys.dm_exec_requests req
OUTER APPLY 
    sys.dm_exec_sql_text(req.sql_handle) AS sqltext
Run Code Online (Sandbox Code Playgroud)

但是,这仅显示存储过程的 create 语句的文本。例如:

CREATE PROCEDURE IMaProcedure @id int AS SELECT * FROM AllTheThings Where id = @id
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想看看运行过程的参数是什么,导致它针对特定的一组违规参数运行这么长时间。

有没有办法做到这一点?(在这个问题中, Aaron Bertrand提到了DBCC InputBuffer,但我认为这不适合这个问题。)

sql-server-2005 sql-server stored-procedures t-sql dmv

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

SQL Server 的 8 KB 数据页中未使用 512 字节

我创建了下表:

CREATE TABLE dbo.TestStructure
(
    id INT NOT NULL,
    filler1 CHAR(36) NOT NULL,
    filler2 CHAR(216) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

然后创建了一个聚集索引:

CREATE CLUSTERED INDEX idx_cl_id 
ON dbo.TestStructure(id);
Run Code Online (Sandbox Code Playgroud)

接下来我用 30 行填充它,每个大小为 256 字节(基于表声明):

DECLARE @i AS int = 0;

WHILE @i < 30
BEGIN
    SET @i = @i + 1;

    INSERT INTO dbo.TestStructure (id, filler1, filler2)
    VALUES (@i, 'a', 'b');
END;
Run Code Online (Sandbox Code Playgroud)

现在根据我在“Training Kit (Exam 70-461): Querying Microsoft SQL Server 2012 (Itzik Ben-Gan)”一书中读到的信息:

SQL Server 在内部以页为单位组织数据文件中的数据。一个页面是一个 8 KB 的单位,属于一个单一的对象;例如,到表或索引。页是读取和写入的最小单位。页面被进一步组织成范围。一个区由八个连续的页面组成。一个范围内的页面可以属于单个对象或多个对象。如果页面属于多个对象,则该范围称为混合范围;如果页面属于单个对象,则该范围称为统一范围。SQL Server 将对象的前八页存储在混合区中。当对象超过八页时,SQL Server 会为此对象分配额外的统一区。通过这种组织,小物体浪费的空间更少,大物体的碎片化程度也更低。

所以这里我有第一个混合范围 …

index sql-server data-pages t-sql

13
推荐指数
2
解决办法
912
查看次数

表中的NULL值自我比较

我总是对一些神秘的 t-sql 行为感到困惑,如下所示

-- Create table t and insert values.  
use tempdb
CREATE TABLE dbo.t (a INT NULL);  
-- insert 3 values
INSERT INTO dbo.t values (NULL),(0),(1);  
GO  
set ansi_nulls off -- purposely turn off, so we can allow NULL comparison, such as null = null
go
-- expect 3 rows returned but only 2 returned (without null value row)
select * from dbo.t where a = a 
Run Code Online (Sandbox Code Playgroud)

这不是关于如何检索表中的所有行,也不是关于避免使用 ANSI_NULLS。

我只是想征求一些见解,为什么 t-sql 会这样。

sql-server t-sql sql-server-2012

13
推荐指数
3
解决办法
369
查看次数

“和”与“&amp;”的区别

我试图了解逻辑运算的优先顺序并具有以下代码:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F
Run Code Online (Sandbox Code Playgroud)

它返回一个错误

关键字“and”附近的语法不正确。

我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。

sql-server t-sql

13
推荐指数
1
解决办法
3086
查看次数

克服 LIKE 字符长度限制

通过在此处阅读此LIKE 字符长度限制,看起来我无法在 LIKE 子句中发送超过 ~4000 个字符的文本。

我正在尝试从特定查询的查询计划缓存中获取查询计划。

SELECT *
FROM sys.dm_exec_cached_plans AS cp 
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp 
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?'
Run Code Online (Sandbox Code Playgroud)

如果里面的查询LIKE超过 4000 个字符,那么即使我的查询在缓存计划中,我也会得到 0 个结果。(我期待至少有一个错误)。

有没有办法解决这个问题或采取不同的方式?我有可能是 >10000字符长的查询,看起来我无法通过LIKE.

sql-server t-sql like sql-server-2016

13
推荐指数
1
解决办法
945
查看次数

这个 WHERE 子句中的 % 有什么作用?

我正在接受培训,其中一个脚本具有以下命令:

SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1
Run Code Online (Sandbox Code Playgroud)

我想知道这个片段在 WHERE 子句中的用途: Col1 % 3 = 1

我在互联网上做了一些研究,没有找到关于这个命令的参考。

sql-server t-sql

13
推荐指数
3
解决办法
6172
查看次数