從多個表中提取資料的遊標使用方法
P粉141035089
P粉141035089 2023-08-16 13:12:27
0
2
555
<p>我有一個查詢,回傳多個表,類似這樣:</p> <pre class="brush:php;toolbar:false;">SELECT TableName, DatabaseName '.' TableName, ColumnName FROM DBC.Columns WHERE ColumnName = 'id'</pre> <p>我需要透過查看儲存在這些表中的資訊來循環遍歷這些表,以便只獲取特定的表。 </p> <p>我嘗試了下面的程式碼,使用了'LOOP'和遊標,但它顯示<code>查詢無效</code>(代碼來自這裡):</p> <pre class="brush:php;toolbar:false;">DECLARE cursor_Tables CURSOR FOR SELECT DatabaseName || '.' || TableName FROM DBC.Columns WHERE ColumnName ='id'; OPEN cursor_Tables; label1: LOOP FETCH cursor_Tables into tbName; IF (SQLSTATE ='02000') THEN LEAVE label1; END IF; CASE WHEN ( SELECT COUNT(*) FROM prd3_db_tmd.K_PTY_NK01 WHERE id = 0 ) > 0 THEN tbName END END LOOP label1; CLOSE cursor_Tables; END;</pre> <p>我該如何解決這個問題?我需要額外使用預存程序嗎? DBMS是Teradata。 </p>
P粉141035089
P粉141035089

全部回覆(2)
P粉221046425

如果這是SQL Server,您可以查看以下SQL遊標,我編輯了遊標聲明和其中的程式碼 雖然它們可能與您的要求不同,但我認為您可以輕鬆修改

declare @sql nvarchar(max)
declare @tablename nvarchar(100)

DECLARE cursor_Tables CURSOR FOR     
    SELECT s.name + '.' + o.name 
        --s.name [schema], o.name [table]
    FROM   sys.Columns c
    inner join sys.objects o on c.object_id = o.object_id
    inner join sys.schemas s on s.schema_id = o.schema_id
    WHERE  c.Name  ='id' and o.type = 'U'

/*
SELECT TableName, DatabaseName +'.'+ TableName, ColumnName
FROM DBC.Columns
WHERE ColumnName = 'id'
*/
OPEN cursor_Tables; 

FETCH NEXT FROM cursor_Tables INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

--  print @tablename
set @sql = 'select case when count(*) > 0 then ''' + @tablename + ''' else '''' end from ' + @tablename
exec sp_executesql @sql

 FETCH NEXT FROM cursor_Tables INTO @tablename
END

CLOSE cursor_Tables;
DEALLOCATE cursor_Tables;
P粉752479467

您需要一個預存程序,因為這是在Teradata中唯一可以使用遊標的地方。

REPLACE PROCEDURE testproc()
DYNAMIC RESULT SETS 1
BEGIN
   DECLARE tbName VARCHAR(257);
   DECLARE SqlStr VARCHAR(500);

   -- 临时表来存储结果集
   CREATE VOLATILE TABLE _vt_(tbName VARCHAR(257)) ON COMMIT PRESERVE ROWS;

   -- 您现有的查询来返回表名
   -- 最好使用ColumnsV而不是Columns
   FOR cursor_Tables AS    
       SELECT DatabaseName || '.' || TABLENAME AS tbName
       FROM   DBC.ColumnsV
       WHERE  ColumnName  ='id'
   DO -- 准备动态SQL ...
      SET SqlStr = 
         'insert into _vt_
          select ''' || cursor_tables.tbName || ''' 
          from ' || cursor_tables.tbName || '
          where id = 0 
          having count(*) > 0;
          ';
      -- ... 并执行它
      EXECUTE IMMEDIATE SqlStr;
   END FOR;

   BEGIN -- 返回结果集
      DECLARE resultset CURSOR WITH RETURN ONLY FOR S1;
      SET SqlStr = 'SELECT * FROM _vt_;';
      PREPARE S1 FROM SqlStr;
      OPEN resultset;
   END;

   DROP TABLE vt;
END;
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!