【问题标题】:Having trouble converting SQL query to XML ouput for SQL Server 2000将 SQL 查询转换为 SQL Server 2000 的 XML 输出时遇到问题
【发布时间】:2017-05-24 03:39:12
【问题描述】:

我需要为SQL 2000输出以下XML格式的查询。看来我的子查询太多了,SQL 2000中XML的嵌套级别必须准确。任何帮助表示赞赏。

SELECT sd.dbid AS DatabaseID
,NAME AS DatabaseName
,CASE 
    WHEN NAME IN (
            'master'
            ,'msdb'
            ,'model'
            ,'tempdb'
            ,'distribution'
            )
        THEN 'S'
    ELSE 'U'
    END AS SysUserType
,cmptlevel AS CompatibilityLevel
,databasepropertyex(NAME, 'Collation') AS CollationName
,CASE 
    WHEN databasepropertyex(NAME, 'Status') = 'ONLINE'
        THEN 0
    WHEN databasepropertyex(NAME, 'Status') = 'RESTORING'
        THEN 1
    WHEN databasepropertyex(NAME, 'Status') = 'RECOVERING'
        THEN 2
    WHEN databasepropertyex(NAME, 'Status') = 'RECOVERY_PENDING'
        THEN 3
    WHEN databasepropertyex(NAME, 'Status') = 'SUSPECT'
        THEN 4
    WHEN databasepropertyex(NAME, 'Status') = 'EMERGENCY'
        THEN 5
    WHEN databasepropertyex(NAME, 'Status') = 'OFFLINE'
        THEN 6
    WHEN databasepropertyex(NAME, 'Status') = 'COPYING'
        THEN 7
    END AS STATE
,databasepropertyex(NAME, 'Status') AS StateDesc
,CASE 
    WHEN databasepropertyex(NAME, 'Recovery') = 'FULL'
        THEN 1
    WHEN databasepropertyex(NAME, 'Recovery') = 'BULK_LOGGED'
        THEN 2
    WHEN databasepropertyex(NAME, 'Recovery') = 'SIMPLE'
        THEN 3
    END AS RecoveryModel
,databasepropertyex(NAME, 'Recovery') AS RecoveryModelDesc
,crdate AS DatabaseCreationDate
,B.last_db_backup_date AS LastBackupDate
,a.SizeMB AS SizeMB
,c.NumberOfConnections AS ActiveDBConnections
,SERVERPROPERTY('Machinename') AS SQLServerName
,CASE 
    WHEN SERVERPROPERTY('Instancename') IS NULL
        THEN 'Default'
    ELSE SERVERPROPERTY('Instancename')
    END AS SQLServerInstanceName
,SERVERPROPERTY('ProductVersion') AS SQLServerVersion
,SERVERPROPERTY('Edition') AS SQLServerEdition
FROM (
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SERVER
    ,msdb.dbo.backupset.database_name
    ,MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
GROUP BY msdb.dbo.backupset.database_name
) AS B
FULL JOIN sysdatabases sd ON sd.NAME = b.database_name
INNER JOIN (
SELECT (SUM(size) * 8 / 1024) AS SizeMB
    ,dbid
FROM sysaltfiles
GROUP BY dbid
) AS A ON sd.dbid = a.dbid
FULL JOIN (
SELECT DB_NAME(dbid) AS DBName
    ,COUNT(dbid) AS NumberOfConnections
FROM sysprocesses
WHERE dbid > 0
    AND spid >= 51
GROUP BY dbid
) AS C ON sd.NAME = C.DBName
ORDER BY sd.dbid

我能够为 SQL 2005 及更高版本编写此代码并且工作正常!但我一辈子都无法为 SQL 2000 获得它

SELECT sd.database_id AS DatabaseID
,sd.NAME AS DatabaseName
,CASE 
    WHEN sd.NAME IN (
            'master'
            ,'msdb'
            ,'model'
            ,'tempdb'
            ,'distribution'
            )
        THEN 'S'
    ELSE 'U'
    END AS SysUserType
,sd.compatibility_level AS CompatibilityLevel
,sd.collation_name AS CollationName
,sd.STATE AS STATE
,sd.state_desc AS StateDesc
,recovery_model AS RecoveryModel
,recovery_model_desc AS RecoveryModelDesc
,create_date AS DatabaseCreationDate
,B.last_db_backup_date AS LastBackupDate
,a.SizeMB AS SizeMB
,c.NumberOfConnections AS ActiveDBConnections
,SERVERPROPERTY('Machinename') AS SQLServerName
,CASE 
    WHEN SERVERPROPERTY('Instancename') IS NULL
        THEN 'Default'
    ELSE SERVERPROPERTY('Instancename')
    END AS SQLServerInstanceName
,SERVERPROPERTY('ProductVersion') AS SQLServerVersion
,SERVERPROPERTY('Edition') AS SQLServerEdition
FROM (
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SERVER
    ,msdb.dbo.backupset.database_name
    ,MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date
FROM msdb.dbo.backupmediafamily
INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id
GROUP BY msdb.dbo.backupset.database_name
) AS B
RIGHT JOIN sys.databases sd ON sd.NAME = B.database_name
INNER JOIN (
SELECT (SUM(size) * 8 / 1024) AS SizeMB
    ,database_id
FROM sys.master_files
GROUP BY database_id
) AS A ON sd.database_id = a.database_id
FULL JOIN (
SELECT DB_NAME(dbid) AS DBName
    ,COUNT(dbid) AS NumberOfConnections
FROM sys.sysprocesses
WHERE dbid > 0
    AND spid >= 51
GROUP BY dbid
) AS C ON sd.NAME = C.DBName
ORDER BY sd.database_id
FOR XML RAW ('DATABASES'),
ROOT ('SERVERROOT'),
Elements

【问题讨论】:

  • 有什么工具可以帮我进行这种转换吗?

标签: sql xml sql-server-2000


【解决方案1】:

试试这个:我通过直接调用三个列 LastBackupDateSizeMBActiveDBConnections 来简化您的查询,而无需您的膨胀连接。没有准备好测试的 SQL-Server-2000,但我认为这应该可以工作:

SELECT 
     sd.dbid AS DatabaseID
    ,NAME AS DatabaseName
    ,CASE 
        WHEN NAME IN ('master','msdb','model','tempdb','distribution') THEN 'S'
        ELSE 'U'
     END AS SysUserType
    ,cmptlevel AS CompatibilityLevel
    ,databasepropertyex(NAME, 'Collation') AS [CollationName]
    ,CASE databasepropertyex(NAME, 'Status') 
        WHEN 'ONLINE'              THEN 0
        WHEN 'RESTORING'           THEN 1
        WHEN 'RECOVERING'          THEN 2
        WHEN 'RECOVERY_PENDING'    THEN 3
        WHEN 'SUSPECT'             THEN 4
        WHEN 'EMERGENCY'           THEN 5
        WHEN 'OFFLINE'             THEN 6
        WHEN 'COPYING'             THEN 7
     END AS [STATE]
    ,databasepropertyex(NAME, 'Status') AS StateDesc
    ,CASE databasepropertyex(NAME, 'Recovery')
        WHEN 'FULL'                THEN 1
        WHEN 'BULK_LOGGED'         THEN 2
        WHEN 'SIMPLE'              THEN 3
     END AS RecoveryModel
    ,databasepropertyex(NAME, 'Recovery') AS RecoveryModelDesc
    ,crdate AS DatabaseCreationDate
    ,(SELECT MAX(bs.backup_finish_date) FROM msdb.dbo.backupset AS bs WHERE bs.database_name=sd.name) AS LastBackupDate
    ,(SELECT (SUM(saf.size) * 8 / 1024) FROM sysaltfiles AS saf WHERE saf.dbid=sd.dbid) AS SizeMB
    ,(SELECT COUNT(sp.dbid) FROM sysprocesses AS sp WHERE dbid > 0 AND spid >= 51 AND sp.dbid=sd.dbid) AS ActiveDBConnections
    ,SERVERPROPERTY('Machinename') AS SQLServerName
    ,CASE 
        WHEN SERVERPROPERTY('Instancename') IS NULL
            THEN 'Default'
        ELSE SERVERPROPERTY('Instancename')
        END AS SQLServerInstanceName
    ,SERVERPROPERTY('ProductVersion') AS SQLServerVersion
    ,SERVERPROPERTY('Edition') AS SQLServerEdition
FROM sysdatabases sd 
ORDER BY sd.dbid

一个提示

您可能知道,SQL-Server 还不知道 XML 类型,但有 FOR XML RAWFOR XML AUTOFOR XML EXPLICIT 返回字符串类型的 XML。

【讨论】:

  • 谢谢!这帮助我朝着正确的方向前进。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
相关资源
最近更新 更多