我有大约80个表的MS SQL 2012数据库。每个表都有一列UserID
,用于标识创建或上次编辑记录的用户。我想编写一个sql语句,它将为我提供所有数据库表中某些userID的已创建/已编辑记录的数量。
例如,UserID = 1的用户是Table1中3条记录的作者和Table2中2条记录的作者。 Sql语句需要给我一个这样的结果:
怎么做?感谢。
答案 0 :(得分:1)
试试这个,它为数据库中的所有表构建一个动态查询,然后执行它:
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = '(SELECT COUNT(*) FROM QUOTENAME(TABLE_NAME) WHERE user_id = 1) +'
FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES
SELECT @sql = 'SELECT' + LEFT(@sql, LEN(@sql) - 1) -- remove the last +
--PRINT(@sql) -- we may want to use PRINT to debug the SQL
EXEC(@sql)
在运行之前键入数据库名称而不是<DATABASE_NAME>
。
答案 1 :(得分:1)
如果您使用的是MS-SQL数据库且所有表都有UserId(int)作为公共列,那么您可以使用此查询来获取结果 - 请尝试以下方法:
CREATE TABLE #counts
(
row_count INT,
UserID INT
)
EXEC sp_MSForEachTable @command1='INSERT #counts (row_count,UserId) SELECT COUNT(*),UserId FROM ? GROUP BY UserID '
SELECT SUM(row_count),userid FROM #counts GROUP BY UserID
DROP TABLE #counts
谢谢!
答案 2 :(得分:1)
我怀疑“EXEC sp_MSForEachTable”解决方案不起作用,假设数据库中有更多的表,没有那个User Id列,除非您使用try catch块显式处理此类故障。在那种情况下肯定会失败。
这里的解决方案只考虑那些具有所需列的表。
--To get the List of Table having the required column and Storing them into Temp Table.
Select ID = IDENTITY(Int,1,1),Object_Name(object_id) As TableName Into #ReqTables
From sys.columns where name = 'Crets'
--Creating Table to Store Row count result.
Create Table #RowCounts
(
Row_Count Int
, UserID Int
)
--Declaring variables
Declare @min Int,@max int,@TableName Nvarchar(255)
--get min and Max values from Required table for looping
Select @min = Min(Id),@max = Max(ID) From #ReqTables
--loop through Min and Max
While(@min <= @max)
BEgin
--get the table for a given loop Counter
Select @TableName = tableName From #ReqTables Where Id = @min
--Executing the Dynamic SQl
Exec ('Insert Into #RowCounts (Row_Count,UserID) Select Count(*),UserID From ' + @TableName + ' Group by UserID')
--incrementing the Counter
Set @min = @min + 1
End