标签: t-sql

单个查询从一个数据库中的多个表中获取数据

我有 36 个 Microsoft SQL Server VM,每个都有一个以 _Sec 结尾的特定数据库作为数据库名称。该数据库中有 2 个表,我需要在单个查询中从中获取数据:tblConnGroupstblConnGroupsDet.

tblConnGroups 有 3 列我需要包含在结果中

tblConnGroups.ID
tblConnGroups.GroupName
tblConnGroups.Provisional
Run Code Online (Sandbox Code Playgroud)

tblConnGroupsDet 结果中基本上有一个列。

tblConnGroupsDet.GroupID
tblConnGroupsDet.DBName
Run Code Online (Sandbox Code Playgroud)

tblConnGroups.ID是在使用的密钥tblConnGroupsDet.GroupID,然而,在tblConnGroupsID领域具有一对多的关系到GroupID在字段tblConnGroupsDet

Connection Group Name 只出现在tblConnGroups带有它的ID, 和其他信息中,但是GroupID将出现在tblConnGroupsDet带有成员数据库名称的每一行中。

USE [Name_Sec];
GO
SELECT ID,Groupname,Provisional 
from [tblConnGroups] 
ORDER BY ID ASC

ID   GroupName       Provisional
514  Name_FY0910     0
844  Name_FY1011     0
1588 NameTest_FY1516 1

USE [Name_Sec];
GO
SELECT GroupID,DBName 
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

基于变量执行计算的函数

我看到@ypercube 的回答??这对如何计算似乎是由 3 订购的数量并给出整数答案给出了很好的答案。这让我想到,如果要拆分的次数可变,您将如何处理?

这意味着这是你总是会被 3 分割的 OP(原始海报

Create Table #Orders 
(
    id int IDENTITY(1,1) PRIMARY KEY NOT NULL
    ,partid varchar(100) NOT NULL
    ,qtyordered int DEFAULT '0'
    ,orderedby varchar(100) NOT NULL
    ,ordereddate date DEFAULT GETDATE()
) ;

Insert Into #Orders (partid, qtyordered, orderedby) VALUES
('SS100', 10, 'James'), ('RR200', 5, 'Bob'), ('NN300', 3, 'Jake'), ('OO400', 5, 'Blue') ;

SELECT 
   partid,
   qtyordered,
   [First], 
   [Second],
   [Third] 
FROM 
    #Orders 
  CROSS APPLY
    ( SELECT [Third]  = (qtyordered)                      / 3 )  AS q3
  CROSS APPLY …
Run Code Online (Sandbox Code Playgroud)

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

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

使用计数更新查询

我正在尝试运行以下更新查询

UPDATE x
SET totalval = COUNT(projs)
FROM Prs x
LEFT JOIN es y
ON x.CS = y.CS
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

消息 157,级别 15,状态 1,第 2 行
聚合可能不会出现在 UPDATE 语句的集合列表中。

应如何更改此语句才能使其成为有效的更新语句?

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

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

SSIS 与 SQL Server 的关系是什么?

我发现诸如“SSIS”、“SSDT”等的首字母缩略词对于它们与 SQL Server 的关系有点令人困惑。在我看来,SQL Server 实现了 T-SQL 语言,并且诸如“SSIS”之类的包是 T-SQL 语言上的第三方“包装器”,并且实际上是 SQL Server 的插件。这样对吗?

这篇博文(这里)提到了 SSIS 与 T-SQL 的优势(这就是为什么我认为 SSIS 是 T-SQL 的包装器)。此外,我可以看到创建为 SSIS 包的作业可以在 SSMS 的 SQL Server 代理下找到。

sql-server ssis t-sql ssdt

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

tsql 进程永远运行......它在做什么

尝试创建一个大型测试数据库时,我创建了一个 SP,它使用预定义的表列表(我感兴趣的 35 个)并将每个表中的数据相乘。

换句话说,一张表有一个商店的数据。我将相同的数据插入到该表中,但具有不同的商店编号(这给了我 2 个商店)。然后我调用将 2 个商店数据乘以 4 个商店的同一个 SP,依此类推。上周末,我开始对 SP 进行 6 次后续调用,认为当我周一回来时,我的数据库将拥有 64 家商店的数据。不幸的是,事实并非如此......

当我周一来时,我发现数据高清已满,但该过程从未崩溃并且似乎已暂停。我的数据库处于简单恢复模式,我通过移动文件和缩小 TempDB(通过 SSMS 中的缩小文件选项)来腾出空间,并在外部驱动器上创建了一个初始大小为 100GB 的额外 ndf 文件......进程仍在运行(腾出空间后超过 24 小时)。

spid 的任务状态显示暂停,等待类型为 PAGEIOLATCH_EX,但等待时间很短(低于 100 毫秒),这让我相信进程仍在运行。

35 个表中有 34 个大小合适,乘法速度足够快... 该过程已将所有表中的 1 个数据存储乘以 8 个存储,并且仍在完成数据从 8 个存储到 16 个存储的乘法过程......它似乎正在处理的一张桌子是所有桌子中最大的......

将这个表的 8 个存储区的数据乘以 16 个存储区的实际过程是从 4 亿条记录中插入 4 亿条记录,该表有 200 列所有不同类型。

我是在浪费时间等待吗?恐怕杀死进程需要几天时间才能回滚......我应该等待吗?它变成了一个 Phantom 过程吗?我怎么知道它在做什么?

任何意见/想法将不胜感激。

谢谢

sql-server t-sql activity-monitor wait-types

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

使用 Row_Number() 的无效列

我试图只选择从查询返回的第一行。这是我的语法->

insert into @Temp (id, salesID)
select
    RN = ROW_NUMBER() OVER(order by t.psUserID)
    ,t.psUserID
from (
    select distinct 
    psUserID = rstln.Bama   
    From rusticlines rstln  
    AND tnr.Active = '1') t
WHERE RN = 1;
Run Code Online (Sandbox Code Playgroud)

我得到错误:

消息 207,级别 16,状态 1,第 51 行
无效的列名称“RN”。

我需要更改什么才能只选择第一行号?

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

3
推荐指数
2
解决办法
2373
查看次数

将 TSQL 存储过程编译成程序集

我正在尝试保护我的业务逻辑,但我不想使用“使用加密”,因为它是不够的并且可能会被破坏。

我不想再次用 CLR 语言重新编写程序。

是否有一种简单的方法可以将 TSQL 编程编译为可供 SQL Server 使用的 DLL,就像它使用 CLR 程序集的方式一样?

sql-server stored-procedures t-sql encryption sql-clr

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

如何比较两个不同 VARCHAR 列中的字符串?

我需要一种方法来比较两varchar列的内容,命名fistnamelastname相应,如果内容存在于 中firstname,则将其从lastname. 理想情况下,我想在没有更新查询的情况下执行此操作,但如果这是实现它的唯一方法,那么我可以走那条路。

这是示例 DDL 和 DML:

Declare @BadData Table
(
    firstname varchar(500)
    ,lastname varchar(500)
)

Insert Into @BadData (firstname, lastname) Values
('Bridget Jones', 'Jones, III'), ('Butch', 'Jones'), ('Key West', 'West')
,('Bob Marly', 'Junior')

Select * From @BadData
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果集:

firstname       lastname
-------------   ----------
Bridget Jones   Jones, III
Butch           Jones
Key West        West
Bob Marly       Junior
Run Code Online (Sandbox Code Playgroud)

我想要的结果集是:

firstname       lastname
-------------   --------
Bridget Jones   , III
Butch   Jones
Key West    
Bob Marly …
Run Code Online (Sandbox Code Playgroud)

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

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

我们通常什么时候将所有分区映射到同一个文件组?

我正在 MSDN 的 SQL-Server 中学习“分区功能”和“分区架构”。我发现这种将所有分区映射到同一个文件组的语法。例如:

CREATE PARTITION FUNCTION myRangePF3 (int)  
AS RANGE LEFT FOR VALUES (1, 100, 1000);  
GO  
CREATE PARTITION SCHEME myRangePS3  
AS PARTITION myRangePF3  
ALL TO ( test1fg );
Run Code Online (Sandbox Code Playgroud)

我的问题是,这样做的关键是什么?这甚至称为分区吗???我们通常什么时候将所有分区映射到同一个文件组?

sql-server t-sql

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

如何对 Varchar 数据类型求和

在 SQL Server 2008 中,我有一个结构相似的表。不幸的是,改变数据结构不是一种选择,所以我一直试图想出一个替代方案。我曾尝试运行此查询,但出现以下错误:

(受影响的 5 行)
消息 8114,级别 16,状态 5,第 9行将
数据类型 varchar 转换为数字时出错。

这是 DDL - 应该在查询中更改什么语法才能接收有效输出而不是错误消息?

Declare @GreenHouse Table
(nomen varchar(100), vtc varchar(100), d1 date)

Insert Into @GreenHouse (nomen, vtc, d1) VALUES
('Green', '507.02', '2016-01-14'), ('Green', '4.44089e-015', '2016-01-03')
,('Green', '200.57', '2016-01-18'), ('Green', '649.01', '2016-01-19'),
('Green', '1849.85', '2016-04-30')

Select nomen, Round(Sum(Cast(vtc As Decimal(10,2))),0.00) As FormatedInfo, d1
FROM @GreenHouse Group By nomen, d1 Order By d1 DESC 
Run Code Online (Sandbox Code Playgroud)

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

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