需要在 sqlserver 2008 中使用带有动态 sql 的更新语句

Need to use Update statement with dynamic sql in sqlserver 2008

我有一个包含三列的目标 table dbo.valtable_schematable_namerow_count,架构和名称已经填充并且各自特定数据库的行计数设置为零。
我需要每个 table 名称的行计数,但不能使用系统 tables 进行行计数,因为它们有时可能会提供不准确的数据。

我使用游标从 INFORMATION_SCHEMA.TABLES 获取 table 和架构名称以填充 @tb_schema@tb_table 变量并使用第三个变量 @c_name 俱乐部

set @c_name = @tb_schema + '.' + @tb_name; 

我需要更新 stament 以从 @c_name 获取动态计数并填充 dbo.valrow_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