小编And*_*y M的帖子

从视图生成 SQL 表 DDL

如何在一个脚本中从视图生成表结构?只需要数据类型,我正在寻找具有某种类型的动态 sql 的表创建脚本

(1) 可以删除主键/约束,

(2) 不在乎是否添加了 null/not null(但是如果有的话会很好)

我在下面提出了示例问题/答案,请随时对未包含在表中的其他数据类型进行代码审查、编辑/优化,特殊情况/问题/例外可能没有考虑在内。顺便说一下,是否有任何开源代码?

表 1 和 2:

create table dbo.Customer
(
     CustomerId int primary key,
     CustomerName varchar(255),
     ZipCode varchar(9)
)
create table dbo.CustomerTransaction
(
     CustomerTransactionId int primary key identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2),
     PurchaseDate datetime
)
Run Code Online (Sandbox Code Playgroud)

看法:

create view dbo.CustomerTransactionVw
as
select 
     ct.CustomerTransactionId,
     ct.SalesAmount,
     ct.PurchaseDate,
     cust.CustomerId,
     CustomerName,
     cust.ZipCode
from dbo.CustomerTransaction ct
inner join dbo.Customer cust
  on cust.CustomerId = ct.CustomerId
Run Code Online (Sandbox Code Playgroud)

预期的表创建脚本:

create table dbo.CustomerTransactionBigTable
(
     CustomerTransactionId int identity(1,1),
     CustomerId int,
     SalesAmount numeric (10,2), …
Run Code Online (Sandbox Code Playgroud)

sql-server view dmv sql-server-2016

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

运行多批处理脚本的 SQLCMD 中的会话 ID

我的脚本包含多个GO关键字。我知道 SQLCMD 解释GO为批处理分隔符,因此代码不是作为单个块运行的,而是分隔符(批处理)之间的每个部分单独运行。我的问题是,所有批次都在同一个会话中执行吗?

我尝试使用一个简单的脚本来测试这个:

SELECT @@SPID
GO

SELECT @@SPID
GO

SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)

然后我使用此命令从命令行运行脚本

SELECT @@SPID
GO

SELECT @@SPID
GO

SELECT @@SPID
GO
Run Code Online (Sandbox Code Playgroud)

并得到这个输出:

SQLCMD -S MyServer\Instance -E -i MyScript.sql
Run Code Online (Sandbox Code Playgroud)

它似乎肯定地回答了我的问题,但后来我再次运行脚本并得到完全相同的输出,即所有值都是一样的62。显然,SQLCMD 的两个单独执行不可能在同一个会话中运行,它们只是碰巧收到了相同的会话 ID。但这反过来又让我认为@@SPID单次运行返回的相同值也不一定意味着它是同一个会话。每个批处理都可以在恰好收到相同 ID 的不同会话中执行,类似于 SQLCMD 的不同执行在具有相同 ID 的不同会话中运行的方式。

因此,我的问题仍然存在:是否在同一会话中在 SQLCMD 中执行了多个批次的相同脚本?有没有办法确定这一点?

sql-server sqlcmd session

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

每个数据库只使用一个连接表?

我目前正在为一家保险公司进行数据库设计。示例实体是“客户”、“地址”、“车辆”、“建筑物”等。所以有很多关系,每个关系都有一些上下文。例如,客户车辆:客户可以是车辆的所有者、司机、承租人……基本上我看到两种处理方式:

(1):每个关系的连接表,带有两个外键和一个上下文 ID。这将导致许多联结表,其中部分数据很少。由于表的数量,选择会有点困难。

(2):整个数据库的一个连接表。该表将包含两个外键,一个是关于它是什么关系的键(例如客户-车辆)和一个用于上下文的键。这将导致一个巨大的连接表,但也更简单的选择。

哪个是更好的解决方案?有什么主要的优点/缺点,甚至是我没有想到的其他解决方案吗?

感谢您的帮助。如果我表达的不够清楚或有什么不明白的地方,请提问。(英语不是我的母语)

database-design

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

如何使用单个查询从不同服务器中选择数据?

我有挑战!我需要从 4 个不同服务器的 4 个不同表中进行选择。

例子:

Select * from server1.tableS1.sys.view
Select * from server2.tableS2.sys.view
Select * from server3.tableS3.sys.view
Select * from server4.tableS4.sys.view
Run Code Online (Sandbox Code Playgroud)

如何在同一个查询中进行选择?

sql-server select

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

需要故意创建阻塞进程进行测试

我和我的团队有一个问题,我们需要能够识别阻塞其他进程并杀死它们的进程。有大量脚本可免费用于执行这些操作。我们尝试了各种方法并仔细检查了代码。(如果您是发布了这些查询之一的人,谢谢!)

在我进一步讨论之前,让我告诉您这是针对我们无法修改的供应商应用程序。供应商也不愿意花时间找出进程被阻塞的原因。此时我们唯一的选择是终止长时间运行的进程(如供应商支持所建议的那样)。在终止这些进程之前,我们确实检查了正在运行的查询,但在 99.9% 的情况下,它显示为FETCH API_CURSOR00000000000A7E1F,这告诉我们什么都没有。

到目前为止,这一直是一个手动过程。现在,我们希望自动杀死这些长时间运行的阻塞进程,而不是有人手动杀死它们。

我们想在将它投入生产之前测试这个脚本。我们需要一些帮助来创建一个有意创建阻塞进程的脚本。我们已经尝试在 TEST 环境中使用此应用程序,但不幸的是,我们没有成功复制阻塞进程。

提前感谢你的帮助!

process sql-server sql-server-2008-r2 blocking

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

如何删除使用临时?

请帮助我,删除“使用临时”。我尝试了许多不同的选择,无法摆脱。或排序消失或出现“使用临时”。;(

分类表:

 `product_category_multi` (
      `m_Id` mediumint(7) NOT NULL,
      `prod_Id` smallint(6) unsigned NOT NULL,
      `multi_cat` mediumint(7) unsigned NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

索引表:

ALTER TABLE `product_category_multi`
  ADD PRIMARY KEY (`m_Id`),
  ADD KEY `multi_cat` (`multi_cat`),
  ADD KEY `Id` (`prod_Id`);
Run Code Online (Sandbox Code Playgroud)

示例内容表:

m_Id    prod_Id     multi_cat
-------+-----------+---------+  
1       1           5
2       1           1
3       1           6
4       2           5
5       2           1
6       3           5
7       4           5
8       4           6
Run Code Online (Sandbox Code Playgroud)

产品表:

`shop_product` (
  `Id` int(10) unsigned NOT NULL,
  `product_article` varchar(20) NOT NULL,
  `product_article_main` …
Run Code Online (Sandbox Code Playgroud)

mysql execution-plan temporary-tables

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

如何让 SQL Server Management Studio 2012 在打开时自动连接到多个服务器?

当我打开 SQL Server Management Studio 时,它只连接到单个数据库服务器,但我希望它自动连接到多个数据库服务器。

我怎样才能做到这一点?

sql-server ssms

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

AlwaysOn - 添加辅助副本的问题

我在我的笔记本电脑 ( testlab )上安装了 AlwaysOn和三个虚拟机,其中一个是域控制器,两个托管 SQL Server 实例(计划作为一个主副本和一个辅助副本)。一切都很顺利,直到我想将辅助副本添加到可用性组。

请找到随附的屏幕截图。我已经在 TCP/IP 设置中将端口更改为 1433,并且还在 Windows 防火墙中为 SQL Server 添加了一个例外。两台服务器都在同一个集群网络中。不知道我在这里还缺少什么。

在此处输入图片说明

sql-server availability-groups hadr

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

从一个大的平面文件中批量插入前 1000 行

我有一个包含数亿行的大型平面文件。我只想插入其中的前 1000 个。我怎样才能做到这一点?

sql-server bcp bulk-insert

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

比较两列并用空值替换重复项

我有一张这样的表:

id  | t1 | t2
---------------
 1  |  a |  b
 2  |  c |  a
 3  |  a |  e
 4  |  f |  g
 5  |  c |  c
Run Code Online (Sandbox Code Playgroud)

我想比较列t1t2相互比较以删除匹配值并在每列中获取唯一值,如下所示:

   t1 | t2
  -----------
    a |  b
    c |  null
 null |  e 
    f |  g
  null| null
Run Code Online (Sandbox Code Playgroud)

选择哪一行显示值以及其他哪一行显示空值并不重要。例如,由于a在原始数据集的第 3 行中也找到了值,因此以下输出也将有效:

   t1 | t2
  -----------
 null |  b
    c |  null
    a |  e 
    f |  g
  null| null
Run Code Online (Sandbox Code Playgroud)

最终目标是在两列中显示所有不同的值并且没有相同的值。

mysql mysql-5.6

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