查询使用WHERE子句计算服务器上所有数据库的表

时间:2015-07-07 18:38:53

标签: sql sql-server

我正在尝试从CM.SITES执行COUNT,其中可用性等于1(INT)。

我修改了我在网上找到的查询,但是我遇到了添加WHERE子句的问题。

这是我到目前为止,它返回CM.SITES中所有记录的计数

SET NOCOUNT ON;

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp
(
      [COUNT] INT
    , DB VARCHAR(50)
)

DECLARE @TableName NVARCHAR(50) 
SELECT @TableName = 'cm.sites'

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
    SELECT CHAR(13) + 'SELECT ''' + name + ''', COUNT(1) FROM [' + name + '].' + @TableName
    FROM sys.databases 
    WHERE OBJECT_ID(name + '.' + @TableName) IS NOT NULL and @TableName + '.' + 'Availability' is not null
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

INSERT INTO #temp (DB, [COUNT])              
EXEC sys.sp_executesql @SQL

SELECT * 
FROM #temp t

这是有效的,因为它正在寻找可用性IS NOT NULL,但是当我尝试将其更改为= 1时,我收到错误

  

转换nvarchar值时转换失败' cm.sites.Availability'数据类型int。

我尝试将一个Cast添加到SELECT行,但无法弄清楚。

有谁知道我在这里缺少什么?

我需要此查询来运行并计算服务器上的每个数据库。

3 个答案:

答案 0 :(得分:0)

你想改变:

'Availability' is not null

为:

'Availability' =1

你真正应该拥有的是:

'Availability is not null'

很容易变成:

'Availability = 1'

总是混淆在哪里用动态SQL放置引号!

答案 1 :(得分:0)

为动态查询添加where子句。在FROM sys.databases添加此内容之前:

+ ' Where Availability = 1'

答案 2 :(得分:0)

错误告诉您可用性是一个nvarchar列,并且您尝试将其与整数进行比较。 SQL正在尝试将“可用性”列转换为整数并失败。

而是使用Availability =' 1'这样就不会发生类型转换。请注意,这与'0001',' 01'等等不匹配......只是' 1'。

相关问题