首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将SQL查询转换为Server 2000的XML输出

无法将SQL查询转换为Server 2000的XML输出
EN

Stack Overflow用户
提问于 2017-01-09 19:26:50
回答 1查看 33关注 0票数 1

我需要输出SQL 2000的XML格式的以下查询。我似乎有太多的子查询,SQL 2000中XML的嵌套级别必须准确。任何帮助都是非常感谢的。

代码语言:javascript
复制
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的

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-10 08:59:42

尝试如下:我通过直接调用三列LastBackupDateSizeMBActiveDBConnections来简化您的查询,而不需要您膨胀的联接。没有准备好测试的SQL-Server-2000,但我假设它应该可以工作:

代码语言:javascript
复制
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

One提示

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41555440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档