标签: sql-server

在 SQL Server 中创建可以保存存储过程结果的临时表的最简单方法是什么?

很多时候我在处理 SQL Server 时需要编写如下内容。

create table #table_name
(
    column1 int,
    column2 varchar(200)
    ...
)

insert into #table_name
execute some_stored_procedure;
Run Code Online (Sandbox Code Playgroud)

但是,创建一个具有作为存储过程结果的精确语法的表是一项繁琐的任务。例如,sp_helppublication的结果有 48 列!我想知道是否有任何简单的方法可以做到这一点。

谢谢。

sql-server stored-procedures t-sql

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

如何创建 Unicode 参数和变量名称

所有这些都有效:

CREATE DATABASE [¯\_(?)_/¯];
GO
USE [¯\_(?)_/¯];
GO
CREATE SCHEMA [¯\_(?)_/¯];
GO
CREATE TABLE [¯\_(?)_/¯].[¯\_(?)_/¯]([¯\_(?)_/¯] NVARCHAR(20));
GO
CREATE UNIQUE CLUSTERED INDEX [¯\_(?)_/¯] ON [¯\_(?)_/¯].[¯\_(?)_/¯]([¯\_(?)_/¯]);
GO
INSERT INTO [¯\_(?)_/¯].[¯\_(?)_/¯]([¯\_(?)_/¯]) VALUES (N'[¯\_(?)_/¯]');
GO
CREATE VIEW [¯\_(?)_/¯].[vw_¯\_(?)_/¯] AS SELECT [¯\_(?)_/¯] FROM [¯\_(?)_/¯].[¯\_(?)_/¯];
GO
CREATE PROC [¯\_(?)_/¯].[sp_¯\_(?)_/¯] @Shrug NVARCHAR(20) AS SELECT [¯\_(?)_/¯] FROM [¯\_(?)_/¯].[vw_¯\_(?)_/¯] WHERE [¯\_(?)_/¯] = @Shrug;
GO
EXEC [¯\_(?)_/¯].[¯\_(?)_/¯].[sp_¯\_(?)_/¯] @Shrug = N'[¯\_(?)_/¯]';
GO
Run Code Online (Sandbox Code Playgroud)

但是您可能会看到我的意思:我不想要 @Shrug,我想要@¯\_(?)_/¯.

这些都不适用于 2008-2017 的任何版本:

CREATE PROC [¯\_(?)_/¯].[sp_¯\_(?)_/¯] @[¯\_(?)_/¯] NVARCHAR(20) AS SELECT [¯\_(?)_/¯] FROM [¯\_(?)_/¯].[vw_¯\_(?)_/¯] WHERE [¯\_(?)_/¯] …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures t-sql parameter unicode

53
推荐指数
2
解决办法
5505
查看次数

什么是锁升级?

我在面试中被问到这个问题,但没有答案。这里有人能解释一下吗?

sql-server lock-escalation locking

52
推荐指数
4
解决办法
5万
查看次数

为什么主键/外键匹配不用于连接?

据我所知,许多 DBMS(例如 mysql、postgres、mssql)仅使用 fk 和 pk 组合来限制对数据的更改,但它们本身很少用于自动选择要连接的列(就像自然连接与名称一样)。这是为什么?如果你已经用 pk/fk 定义了 2 个表之间的关系,为什么数据库不能弄清楚如果我加入这些表我想在 pk/fk 列上加入它们?

编辑:澄清一下:

假设我有一个 table1 和一个 table2。table1 在 a 列上有一个外键,它引用 table2 上的主键,即 b 列。现在,如果我加入这些表,我将不得不做这样的事情:

SELECT * FROM table1
JOIN table2 ON table1.a = table2.b
Run Code Online (Sandbox Code Playgroud)

但是,我已经使用我的键定义了 table1.a 引用 table2.b,所以在我看来,让 DBMS 系统自动使用 table1.a 和 table2.b 作为连接列应该不难,这样就可以简单地使用:

SELECT * FROM table1
AUTO JOIN table2
Run Code Online (Sandbox Code Playgroud)

然而,许多 DBMS 似乎并没有实现这样的东西。

mysql sql-server

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

移动数据库(备份,恢复)后,我必须重新添加用户

我偶尔会使用 SQL Server Management Studio 中的数据库备份和还原将数据库 (SQL Express 2012) 从开发机器移动到服务器,反之亦然。

每当我这样做时,目标计算机上的应用程序都无法访问数据库,直到我从数据库用户(SQL Server Management Studio 中的数据库、安全性、用户)中删除他们使用的用户“george”并将其重新添加为安全、登录、乔治/属性、用户映射下的所有者。

有一个更好的方法吗?好像有点绕。

sql-server backup

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

添加通配符(或顶部)时 SQL Server 查询速度大幅减慢

我有一个由 2000 万只动物组成的动物园,我在 SQL Server 2005 数据库中对其进行跟踪。其中约 1% 是黑色,约 1% 是天鹅。我想获得所有黑天鹅的详细信息,因此不想淹没我所做的结果页面:

select top 10 * 
from animal 
where colour like 'black'  
and species like 'swan'
Run Code Online (Sandbox Code Playgroud)

(是的,不明智的是,这些字段是自由文本,但它们都已编入索引)。事实证明我们没有这样的动物,因为查询在大约 300 毫秒内返回一个空集。如果我使用 '=' 而不是 'like',它的速度会快两倍,但我有一种预感,后者将为我节省一些打字的时间。

原来动物园管理员认为他可能将一些天鹅输入为“黑色”,因此我相应地修改了查询:

select top 10 * 
from animal  
where colour like 'black%' 
and species like 'swan'
Run Code Online (Sandbox Code Playgroud)

结果证明它们都没有(实际上除了“黑色”动物之外没有“黑色%”动物)但查询现在需要大约 30 秒才能返回空。

似乎只是 'top' 和 'like %' 的组合引起了麻烦,因为

select count(*) 
from animal  
where colour like 'black%' 
and species like 'swan'
Run Code Online (Sandbox Code Playgroud)

返回 0 非常快,甚至

select * 
from animal 
where colour like 'black%' 
and species …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server

52
推荐指数
2
解决办法
3885
查看次数

如何找回一些已删除的记录?

我错误地从远程 SQL Server 2008 表中删除了大约 2,000,000 条记录。服务器未授予我访问服务器端备份文件的权限。

有什么办法可以找回这些记录吗?

sql-server-2008 sql-server recovery

51
推荐指数
3
解决办法
8万
查看次数

迄今为止的演员阵容是可以讨论的,但这是一个好主意吗?

在 SQL Server 2008中添加了日期数据类型。

datetime列转换datesargable并且可以在datetime列上使用索引。

select *
from T
where cast(DateTimeCol as date) = '20130101';
Run Code Online (Sandbox Code Playgroud)

您拥有的另一个选择是改用范围。

select *
from T
where DateTimeCol >= '20130101' and
      DateTimeCol < '20130102'
Run Code Online (Sandbox Code Playgroud)

这些查询是同样好还是应该优先于另一个?

sql-server

51
推荐指数
2
解决办法
8365
查看次数

如何查看当前的数据库邮件配置?

我们的 SQL Server (2008) 实例配置为发送邮件并且一切正常,但我不知道如何查看现有配置,尤其是 SMTP 服务器。

从 SSMS 我只能启动配置向导,我在网上找不到任何东西 - 关于如何设置它的大量信息,但没有关于如何查看当前设置的信息。

如何查看现有设置?

sql-server database-mail

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

SQL Server:如何跟踪 CREATE INDEX 命令的进度?

SQL Server 2014,标准版

我已经读过 dm_exec_requests 中的 percent_complete 不适用于 CREATE INDEX,实际上,percent_complete 坚持为 0。所以这没有帮助。

我目前使用下面的方法,它至少显示了我的运动(索引创建没有被阻止)。但是我完全不知道我是 %10 还是 %99。

我尝试了这里描述的方法:https : //dba.stackexchange.com/a/102545/6229 但它显示了一个明显错误的 est 完成时间(它基本上显示了一个 60+ 分钟的过程的“现在”,我进入了 10 分钟)

我怎样才能得到线索?

SELECT percent_complete, estimated_completion_time, reads, writes, logical_reads, text_size, *
FROM
sys.dm_exec_requests AS r
WHERE
r.session_id <> @@SPID
AND r.session_id = 58
Run Code Online (Sandbox Code Playgroud)

index sql-server sql-server-2014 index-maintenance

51
推荐指数
3
解决办法
5万
查看次数