我正在尝试从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行,但无法弄清楚。
有谁知道我在这里缺少什么?
我需要此查询来运行并计算服务器上的每个数据库。
答案 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'。