小编Raj*_*Raj的帖子

获取SQL Server跨数据库依赖项

SQL Server版本 - 2008 R2

我正在评估DMS解决方案,目的是接管维护.原始解决方案有一个中央数据库,其中包含与制造商有关的数据.它还为每个经销商提供了一个数据库,这意味着存在许多跨数据库依赖关系.

问题:

  • 没有DB文档
  • 没有代码评论
  • 很多堆
  • 没有标准对象命名约定
  • 除了其他对象之外,中央DB还有460多个表和900多个SProc
  • 除了其他对象外,每个经销商DB还有370多个表和2350+个SProcs

作为第一步,我建议彻底清理数据库,因此了解对象依赖关系(包括跨数据库依赖关系)至关重要.我尝试使用Red Gate的解决方案,但输出太大了.我想要的只是数据库中没有任何依赖关系的对象列表 - 它们既不依赖于其他对象,也不依赖于它们的任何对象.

这是我用来获取依赖项列表的脚本:

SELECT
DB_NAME() referencing_database_name,
OBJECT_NAME (referencing_id) referencing_entity_name,
ISNULL(referenced_schema_name,'dbo') referenced_schema_name,
referenced_entity_name,
ao.type_desc referenced_entity_type,
ISNULL(referenced_database_name,DB_NAME()) referenced_database_name
FROM sys.sql_expression_dependencies sed
JOIN sys.all_objects ao
ON sed.referenced_entity_name = ao.name 
Run Code Online (Sandbox Code Playgroud)

我将创建一个表 - 依赖项 - 我将从每个数据库中插入此结果集.下一步,我还将创建另一个表 - AllObjects-,它将包含数据库中所有对象的列表.这是执行此操作的脚本:

SELECT
DB_NAME() DBName,
name,
type_desc
FROM sys.all_objects
WHERE type_desc IN
(
'VIEW',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_STORED_PROCEDURE',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'USER_TABLE',
'SQL_SCALAR_FUNCTION'
)
Run Code Online (Sandbox Code Playgroud)

现在,此表中的名称列表未出现在依赖项表的referenced_entity_name列中,但应该提供我正在查找的对象列表.

SELECT
AO.DBName,
AO.name,
AO.type_desc
FROM AllObjects AO
LEFT OUTER JOIN Dependencies D ON …
Run Code Online (Sandbox Code Playgroud)

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

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

排序选择WITHOUT WHERE或ORDER BY子句的结果顺序

我有一个带有PK聚簇索引的表以及其上的其他索引,包括唯一和非唯一.如果我发出(确切地说):

SELECT * FROM table_name
Run Code Online (Sandbox Code Playgroud)

要么

SELECT col1, col2 FROM table_name
Run Code Online (Sandbox Code Playgroud)

以什么顺序返回行?

这是客户转发给我们的访问调查问卷中的第一个问题.以下是说明:

如果这个问题的答案不正确,请立即终止面试!个人,无论其声明的能力如何,都不了解基于SQL的关系数据库管理系统.这是过去25年多来的SQL-101逻辑.正确答案是:"未知/随机/未确定,因为没有将ORDER BY子句指定为查询的一部分".

我不知道这确实是正确的.欢迎所有评论.

谢谢,

拉吉

t-sql sql-server

5
推荐指数
2
解决办法
1105
查看次数

如何将sql查询的结果转储到文件中

好吧所以我处于这样一种情况,我需要将sql查询的结果转储到一个文件中这是为了备份目的我尝试从我的终端运行以下:

mysql -e "select * from products where brand_id=5" -u root -p database_name > dumpfile.sql
Run Code Online (Sandbox Code Playgroud)

这会转储数据但是使用"insert into statements",所以如果以后我想将这些数据转储回我的数据库,我将重新编写它.这不是正确的方法.那么请建议我如何转储查询结果以备份目的?

mysql database-backups

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

多个select语句合二为一,创建新列

我到处搜索,似乎无法找到解决方案.

现在我知道UNION的功能,但我不确定它是否在这里正确使用.这是我的查询:

  SELECT pos.pdPosition AS [Region 1]  
  FROM PositionData pos 
  WHERE pos.PositionId = 1765
  UNION ALL 
  SELECT pos.pdPosition AS [Region 2] 
  FROM PositionData pos 
  WHERE pos.PositionId = 1767
Run Code Online (Sandbox Code Playgroud)

我想要的是它创建新列,区域1包含数字1的数据和区域2包含数字2的数据.

我得到的是这个:

在此输入图像描述

我该如何拆分/我可以使用什么声明?

注意:这必须是一个select语句.

sql sql-server

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

为什么我的SQL Server 2008查询继续运行?

我在SQL Server 2008 R2中有一个查询,如下所示,当我执行此查询时,它会继续运行...如何调试以找出此代码出了什么问题?任何帮助想法.:)

DECLARE @RESULT TABLE (
     priority int,
     partcode nvarchar(50),
     orderqty int, 
     allocateqty int) 
DECLARE @ORDER TABLE(
     priority int,
     partcode nvarchar(50),
     orderqty int) 
DECLARE @STOCK TABLE(
     partcode nvarchar(50),
     stockqty int) 

INSERT INTO @ORDER (priority,partcode,orderqty) 
VALUES(1,'A',10),     
      (2,'A',40); 
INSERT INTO @STOCK(partcode,stockqty) 
VALUES('A',22);

IF (SELECT SUM(orderqty)FROM @ORDER)<(SELECT stockqty FROM @STOCK)
BEGIN
 INSERT INTO @RESULT(priority,partcode,orderqty,allocateqty)
 SELECT priority, partcode,orderqty,orderqty
 FROM @ORDER
END
ELSE
BEGIN
DECLARE @allocatedqty int = 0
DECLARE @allocateqty int = 1
DECLARE @runningstock int = (SELECT stockqty FROM @stock)
WHILE …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

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

确定服务器产品版本并相应执行SQL的最佳方法?

这是一个双管齐下的问题:场景:

我有一个脚本来查询MSDB并获取作业计划的详细信息.显然,表格从SQL 2000到SQL 2005不同.因此,我想检查框中运行的版本并进行相应的查询.现在的问题是:

问题1:

这就是我在做的事情.

IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='8'
BEGIN
PRINT 'SQL 2000'--Actual Code Goes Here
END
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='9'
BEGIN
PRINT 'SQL 2005'--Actual Code Goes Here
END
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

问题2:

虽然上面的脚本在2000和2005的盒子上运行正常,但当我用我的实际代码替换"Print .."语句时,它在2000盒子上运行正常,但是当在2005盒子上执行时,尝试运行代码块意味着2000并返回错误.

这是实际的代码:

USE [msdb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Check SQL Server Version
IF LEFT(CAST(SERVERPROPERTY('ProductVersion') As Varchar),1)='9'
BEGIN
SELECT @@SERVERNAME
,sysjobs.name
,dbo.udf_schedule_description(dbo.sysschedules.freq_type, dbo.sysschedules.freq_interval,  
dbo.sysschedules.freq_subday_type, dbo.sysschedules.freq_subday_interval, dbo.sysschedules.freq_relative_interval,  
dbo.sysschedules.freq_recurrence_factor, dbo.sysschedules.active_start_date, dbo.sysschedules.active_end_date,  
dbo.sysschedules.active_start_time, dbo.sysschedules.active_end_time) AS [Schedule Description]
, CONVERT(CHAR(8), CASE WHEN LEN(msdb.dbo.sysschedules.Active_Start_Time) = 3
                         THEN CAST('00:0' …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

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