2014-01-20 4 views
0

데이터베이스 관련 정보를 얻으려면이 코드를 사용하고 있습니다.멀티 파트 식별자를 바인딩 할 수 없습니다.

스크립트는 ---

DECLARE @USER_Name SYSNAME 
DECLARE @Database_Name VARCHAR(255) 
DECLARE @SQLQRY VARCHAR(2000) 

DECLARE Database_Cursor CURSOR 
FOR 
SELECT '[' + NAME + ']' AS NAME 
FROM master.dbo.sysdatabases 
WHERE NAME IN ('Aaskiran') 
ORDER BY NAME 

OPEN Database_Cursor 

FETCH NEXT 
FROM Database_Cursor 
INTO @Database_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT 'Database:' + @Database_Name 

    EXECUTE (
      'SELECT Type, COUNT(*) As Objects FROM 
    ' + @Database_Name + '.dbo.sysobjects 
    GROUP BY Type ORDER BY Type' 
      ) 

    EXECUTE (
      'SELECT name As Table_Name FROM 
    ' + @Database_Name + '.dbo.sysobjects 
    WHERE type=''U'' ORDER BY name' 
      ) 

    EXECUTE (
      'SELECT name As Stored_Proc_Name FROM 
    ' + @Database_Name + '.dbo.sysobjects 
    WHERE type=''P'' ORDER BY name' 
      ) 

    DECLARE @Table_Name VARCHAR(255) 

    EXECUTE (
      'DECLARE Table_Cursor CURSOR FOR SELECT name, USER_NAME(uid) FROM 
    ' + @Database_Name + '.dbo.sysobjects 
    WHERE type=''U'' ORDER BY name' 
      ) 

    OPEN Table_Cursor 

    FETCH NEXT 
    FROM Table_Cursor 
    INTO @Table_Name, 
     @User_Name 

    SET @SQLQRY = 'SELECT 
         SUM (row_count) 
        FROM sys.dm_db_partition_stats 
        WHERE 
         object_id=OBJECT_ID(' + @Database_Name + '.[' + @User_Name + '].[' + @Table_Name + ']) 
         AND (index_id=0 or index_id=1)' 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     EXECUTE (@SQLQRY) 

     --EXECUTE('SELECT COUNT(*) AS ['[email protected]_Name+'_Rows_Count] FROM '[email protected]_Name+'. ['[email protected]_Name+'].['[email protected]_Name+']') 
     --print('SELECT COUNT(*) AS ['[email protected]_Name+'_Rows_Count] FROM '[email protected]_Name+'.['[email protected]_Name+'].['[email protected]_Name+']') 
     FETCH NEXT 
     FROM Table_Cursor 
     INTO @Table_Name, 
      @User_Name 
    END 

    CLOSE Table_Cursor 

    DEALLOCATE Table_Cursor 

    FETCH NEXT 
    FROM Database_Cursor 
    INTO @Database_Name 
END 

CLOSE Database_Cursor 

DEALLOCATE Database_Cursor 

하지만 난 오류를 얻고 그

메시지 4104, 수준 16, 상태 1, 줄 1 다중 부분 식별자 "AasKiran. ## MS_PolicyEventProcessingLogin ##. AADetails "를 바인딩 할 수 없습니다.

나는이 오류에 대해 봤지만 대부분의 링크는 조인 상태입니다. 나는 별칭을 사용하지 않았거나 어떤 종류의 조인도하지 않았기 때문에 내 쿼리에서이 문제를 얻지 못한다.

답변

2

OBJECT_ID()으로 전화 할 때 테이블의 이름을 따옴표로 묶지 않으면 오류가 발생합니다. 다음을 사용해야합니다.

SET @SQLQRY = 'SELECT 
        SUM (row_count) 
       FROM sys.dm_db_partition_stats 
       WHERE 
        object_id=OBJECT_ID(''' + @Database_Name + '.[' + @User_Name + '].[' + @Table_Name + ']'') 
        AND (index_id=0 or index_id=1)' 

나는 아직도 당신이 달성하고자하는 것이 확실하지 않지만.

+0

감사합니다. steve; 나중에 내가 버그를 잡았어. 글쎄, 내가 뭘하려고했는지 전후에 데이터베이스의 다른 엔티티 (특정 tsql 스크립트를 실행)가 수행되었습니다 카운트를 만드는 것입니다. 이제 쿼리가 작동합니다. 감사합니다. – Ravi

관련 문제