我制作游标(MSSQL):
CREATE TABLE #temp
(
DB VARCHAR(50),
Tab VARCHAR(50),
[COUNT] INT
)
DECLARE @db_name NVARCHAR (150)
DECLARE @tab1 NVARCHAR (150)
set @tab1 = 'dbo.test'
DECLARE c_db_names CURSOR FOR
SELECT name
FROM sys.databases
WHERE name like '%KNF%'
OPEN c_db_names
FETCH c_db_names INTO @db_name
WHILE @@Fetch_Status = 0
BEGIN
EXEC('
INSERT INTO #temp
SELECT ''' + @db_name + ''',''' + @tab1 + ''',COUNT(*) FROM ' + @db_name + '.' + @tab1 + '
')
FETCH c_db_names INTO @db_name
END
CLOSE c_db_names
DEALLOCATE c_db_names
SELECT * FROM #temp
DROP TABLE #temp
游标计算每个数据库表中的行数。如果没有这样的表,则会出错。
(1 row(s) affected)
(1 row(s) affected)
Msg 208, Level 16, State 1, Line 2
Invalid object name 'KNF_C.dbo.test'.
(2 row(s) affected)
很明显,因为KNF_C数据库没有这个表。我希望整个游标能够处理这样的异常。
预期结果:
DB Tab COUNT
KNF_A dbo.test 3
KNF_B dbo.test 7
KNF_C no table
我知道我应该使用语法例如如果存在但我不知道如何。
请帮助解决此问题
答案 0 :(得分:2)
您需要做的是动态调用sysobjects表以获取表是否存在,然后有条件地选择要插入临时表的内容。
这可能是您需要的代码:
CREATE TABLE #temp
(
DB VARCHAR(50),
Tab VARCHAR(50),
[COUNT] INT
)
DECLARE @str NVARCHAR(1000)
DECLARE @db_name NVARCHAR (150)
DECLARE @tab1 NVARCHAR (150)
DECLARE @count INT
set @tab1 = 'dbo.test'
DECLARE c_db_names CURSOR FOR
SELECT name
FROM sys.databases
WHERE name like '%KNF%'
OPEN c_db_names
FETCH c_db_names INTO @db_name
WHILE @@Fetch_Status = 0
BEGIN
SET @str = N'Select @internalVariable = (select count(1) from ' + @db_name + '.dbo.sysobjects where name = ''' + replace(@tab1, 'dbo.','') + ''') '
exec sp_executesql
@str, --dynamic query
N'@internalVariable int output', --query parameters
@internalVariable = @count output --parameter mapping
IF ( @count = 1 )
BEGIN
EXEC('
INSERT INTO #temp
SELECT ''' + @db_name + ''',''' + @tab1 + ''',COUNT(*) FROM ' + @db_name + '.' + @tab1 + '
')
END
ELSE
BEGIN
EXEC('
INSERT INTO #temp
SELECT ''' + @db_name + ''',''no table'', null
')
end
FETCH c_db_names INTO @db_name
END
CLOSE c_db_names
DEALLOCATE c_db_names
SELECT * FROM #temp
DROP TABLE #temp
答案 1 :(得分:1)
在SQL Server上,您可以使用OBJECT_ID检查对象是否存在:
IF OBJECT_ID('dbo.table_name') IS NOT NULL
DO SOMETHING;
或使用:active selector代替sys.databases。