SQL如下:
create proc sp_MSforeachtable  
 @command1 nvarchar(2000), @replacechar nchar(1) = N'?', @command2 nvarchar(2000) = null,  
   @command3 nvarchar(2000) = null, @whereand nvarchar(2000) = null,  
 @precommand nvarchar(2000) = null, @postcommand nvarchar(2000) = null  
as  
 /* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its own result set */  
 /* @precommand and @postcommand may be used to force a single result set via a temp table. */  
  
 /* Preprocessor won't replace within quotes so have to use str(). */  
 declare @mscat nvarchar(12)  
 select @mscat = ltrim(str(convert(int, 0x0002)))  
  
 if (@precommand is not null)  
  exec(@precommand)  
  
 /* Create the select */  
   exec(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' + REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o '  
         + N' where OBJECTPROPERTY(o.id, N''IsUserTable'') = 1 ' + N' and o.category & ' + @mscat + N' = 0 '  
         + @whereand)  
 declare @retval int  
 select @retval = @@error  
 if (@retval = 0)  
  exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3  
  
 if (@retval = 0 and @postcommand is not null)  
  exec(@postcommand)  
  
 return @retval  提问:select @mscat = ltrim(str(convert(int, 0x0002)))   中的0x0002是什么意思 根据后面的SQL可以看出他是判断是表或者视图或者别的

解决方案 »

  1.   

    0x0002是十六进制的2,这个就是select @mscat ='2'
      

  2.   


    select @mscat = ltrim(str(convert(int, 0x0002))) 
    得到的@mscat为字符串的2
    这样的话后面的就为 o.category & 2= 0 进行相与来判断  发布、约束和标识。
      

  3.   

    那有必要这样写吗
    为什么不直接set @mscat='2'
      

  4.   

    你试试
    select @mscat ='2',结果是否一样不就行了?觉得是一样的,只不过写法不一样而已。