需要在 sqlserver 2008 中使用带有动态 sql 的更新语句
Need to use Update statement with dynamic sql in sqlserver 2008
我有一个包含三列的目标 table dbo.val
:table_schema
、table_name
和 row_count
,架构和名称已经填充并且各自特定数据库的行计数设置为零。
我需要每个 table 名称的行计数,但不能使用系统 tables 进行行计数,因为它们有时可能会提供不准确的数据。
我使用游标从 INFORMATION_SCHEMA.TABLES
获取 table 和架构名称以填充 @tb_schema
和 @tb_table
变量并使用第三个变量 @c_name
俱乐部
set @c_name = @tb_schema + '.' + @tb_name;
我需要更新 stament 以从 @c_name
获取动态计数并填充 dbo.val
的 row_count
列,稍后可以放入循环
这是我尝试过但没有用的方法:
update dbo.val set row_count = Exec ('select COUNT(*) from ' + @full_name)
where table_schema = @tb_schema and table_name =@tb_name ;
我也尝试了下面的方法,但效果不佳
declare @catch numeric (20)
select @catch = Exec ('select COUNT(*) from ' + @full_name) ;
update dbo.validate set cnt = @catch
where tb_schema = @tb_schema and tb_name =@tb_name ;
任何人都可以帮助我,关于如何更新我的目标的行数 table?
请尝试这样的操作:
DECLARE @sqlCommand nvarchar(1000)
DECLARE @full_name varchar(75)
DECLARE @row_count int
SET @full_name = @tb_schema + '.' + @tb_name;
SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM '+ @full_name
EXECUTE sp_executesql @sqlCommand, N'@cnt int OUTPUT', @cnt=@row_count OUTPUT
update dbo.val
set row_count = @row_count
where table_schema = @tb_schema
and table_name =@tb_name
您还需要创建游标以从 dbo.val.
获取 @tb_schema
和 @tb_name
您不需要 CURSOR
来执行此操作。方法如下:
首先,让我们创建示例数据。
--Table to UPDATE
CREATE TABLE validate(
tb_schema VARCHAR(256),
tb_Name VARCHAR(256),
cnt INT
)
INSERT INTO validate VALUES
('dbo', 'TableA', 0), ('dbo', 'TableB', 0);
--Sample TableA with 50 rows
CREATE TABLE TableA(id int);
INSERT INTO TableA
SELECT TOP(50) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM sys.columns a
--Sample TableB with 20 rows
CREATE TABLE TableB(id int);
INSERT INTO TableB
SELECT TOP(20) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM sys.columns a
这里是使用临时 table 的解决方案:
--Temporary table to hold the row counts of each table
CREATE TABLE #temp(
tb_schema VARCHAR(256),
tb_Name VARCHAR(256),
cnt INT
)
--Generate your dynamic SQL here
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql = 'INSERT INTO #temp(tb_schema, tb_Name, cnt)' + CHAR(10)
SELECT @sql = @sql +
'SELECT ''' + SCHEMA_NAME(schema_id) + ''', ''' + name + ''', COUNT(*) FROM ' + QUOTENAME(name) + ' UNION ALL ' + CHAR(10)
FROM sys.tables
WHERE name <> 'validate'
--Remove the last occurence of UNION ALL
SELECT @sql = LEFT(@sql, LEN(@sql) - 11)
--Check the generated SQL
PRINT @sql
EXEC (@sql)
--Update dbo.validate from values in #temp
UPDATE v
SET cnt = t.cnt
FROM dbo.validate v
INNER JOIN #temp t
ON t.tb_schema = v.tb_schema
AND t.tb_name = v.tb_name
--Check result
SELECT * FROM validate
我有一个包含三列的目标 table dbo.val
:table_schema
、table_name
和 row_count
,架构和名称已经填充并且各自特定数据库的行计数设置为零。
我需要每个 table 名称的行计数,但不能使用系统 tables 进行行计数,因为它们有时可能会提供不准确的数据。
我使用游标从 INFORMATION_SCHEMA.TABLES
获取 table 和架构名称以填充 @tb_schema
和 @tb_table
变量并使用第三个变量 @c_name
俱乐部
set @c_name = @tb_schema + '.' + @tb_name;
我需要更新 stament 以从 @c_name
获取动态计数并填充 dbo.val
的 row_count
列,稍后可以放入循环
这是我尝试过但没有用的方法:
update dbo.val set row_count = Exec ('select COUNT(*) from ' + @full_name)
where table_schema = @tb_schema and table_name =@tb_name ;
我也尝试了下面的方法,但效果不佳
declare @catch numeric (20)
select @catch = Exec ('select COUNT(*) from ' + @full_name) ;
update dbo.validate set cnt = @catch
where tb_schema = @tb_schema and tb_name =@tb_name ;
任何人都可以帮助我,关于如何更新我的目标的行数 table?
请尝试这样的操作:
DECLARE @sqlCommand nvarchar(1000)
DECLARE @full_name varchar(75)
DECLARE @row_count int
SET @full_name = @tb_schema + '.' + @tb_name;
SET @sqlCommand = 'SELECT @cnt=COUNT(*) FROM '+ @full_name
EXECUTE sp_executesql @sqlCommand, N'@cnt int OUTPUT', @cnt=@row_count OUTPUT
update dbo.val
set row_count = @row_count
where table_schema = @tb_schema
and table_name =@tb_name
您还需要创建游标以从 dbo.val.
获取@tb_schema
和 @tb_name
您不需要 CURSOR
来执行此操作。方法如下:
首先,让我们创建示例数据。
--Table to UPDATE
CREATE TABLE validate(
tb_schema VARCHAR(256),
tb_Name VARCHAR(256),
cnt INT
)
INSERT INTO validate VALUES
('dbo', 'TableA', 0), ('dbo', 'TableB', 0);
--Sample TableA with 50 rows
CREATE TABLE TableA(id int);
INSERT INTO TableA
SELECT TOP(50) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM sys.columns a
--Sample TableB with 20 rows
CREATE TABLE TableB(id int);
INSERT INTO TableB
SELECT TOP(20) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
FROM sys.columns a
这里是使用临时 table 的解决方案:
--Temporary table to hold the row counts of each table
CREATE TABLE #temp(
tb_schema VARCHAR(256),
tb_Name VARCHAR(256),
cnt INT
)
--Generate your dynamic SQL here
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql = 'INSERT INTO #temp(tb_schema, tb_Name, cnt)' + CHAR(10)
SELECT @sql = @sql +
'SELECT ''' + SCHEMA_NAME(schema_id) + ''', ''' + name + ''', COUNT(*) FROM ' + QUOTENAME(name) + ' UNION ALL ' + CHAR(10)
FROM sys.tables
WHERE name <> 'validate'
--Remove the last occurence of UNION ALL
SELECT @sql = LEFT(@sql, LEN(@sql) - 11)
--Check the generated SQL
PRINT @sql
EXEC (@sql)
--Update dbo.validate from values in #temp
UPDATE v
SET cnt = t.cnt
FROM dbo.validate v
INNER JOIN #temp t
ON t.tb_schema = v.tb_schema
AND t.tb_name = v.tb_name
--Check result
SELECT * FROM validate