我正在 T-SQL 中創建一個程序:
CREATE PROCEDURE usp_QC1
AS
BEGIN
DECLARE @tablename varchar(100);
DECLARE @sfilename varchar(100);
DECLARE @rread varchar(100);
DECLARE @rwrite varchar(100);
DECLARE @sserver varchar(100);
DECLARE @dbname varchar(100);
DECLARE cur_tracking CURSOR FOR
SELECT
[TableName],
sfilename,
[RecordsRead],
[RecordsWritten],
[SQLServer],
[SQLDatabase]
FROM
[ADataTracker].[dbo].[TrackerLoadLog]
WHERE
LOWER(datagroup) LIKE '%Oracle RMS%'
AND SUBSTRING(sfilename, 1, 10) = '2022-03-16'
OPEN cur_tracking;
FETCH NEXT FROM cur_tracking INTO @tablename, @sfilename, @rread, @rwrite, @sserver, @dbname;
WHILE @@Fetch_status = 0
BEGIN
SELECT
sfilename, COUNT(*)
FROM
@sserver '.dbo.' @dbname
WHERE
sfilename = @sfilename
GROUP BY
sfilename
FETCH NEXT FROM cur_tracking INTO @tablename, @sfilename, @rread, @rwrite, @sserver, @dbname;
END;
CLOSE cur_tracking;
DEALLOCATE cur_tracking;
END
游標cur_tracking正在保存資料(僅顯示 1 條記錄)
---------------------------------------------------------------------------------------------------------------------------
TableName |sfilename | RecordsRead |RecordsWritten |SQLServer |SQLDatabase |
History |2022-03-16\20220316032322.dat| 5819560 |5819560 |a.stg.sql.ccaintranet.com |DataRms_Back |
所以游標包含了服務器、資料庫名、表名的所有資訊。我想去那些每個server.db.table并使用這些游標元素檢索資訊:
SELECT sfilename, COUNT(*)
FROM @sserver '.dbo.' @dbname
WHERE sfilename = @sfilename
GROUP BY sfilename
但我收到一個錯誤:
無效
的列名 sfilename 必須宣告表變數 @sserver
uj5u.com熱心網友回復:
這永遠不會起作用:
select sfilename,count(*) from @sserver '.dbo.' @dbname
您不能像這樣引數化物體名稱(資料庫也位于模式之前,您@tablename完全錯過了)。
相反,您可以這樣做:
DECLARE @sql nvarchar(max), @exec nvarchar(1000);
...
-- then inside the cursor:
SET @sql = N'select sfilename = @sfilename,count(*)
FROM dbo.' QUOTENAME(@tablename)
N' WHERE sfilename = @sfilename;';
SET @exec = QUOTENAME(@dbname) N'.sys.sp_executesql';
EXEC @exec @sql, N'@sfilename varchar(100)', @sfilename;
請注意,所有這些都必須是nvarchar(128),并且您可以DECLARE對多個變數使用相同的變數來減輕眼睛疲勞:
DECLARE @tablename nvarchar(128),
@sfilename nvarchar(128),
@dbname nvarchar(128);
請查看此鏈接集合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/468703.html
