我使用下面的查询从我的数据库中的所有表中查找学生名称jason,我可以很容易地看到并知道jason在数据库中的每个表中出现了多少。
但是现在我想要计算出所有桌子中数据库中实际出现了多少jason,我需要出现所有jason的总数。
如何计算Jason而不只是在结果中显示?
DECLARE @ColumnName VARCHAR(20) = 'Student_Name'
DECLARE @VariableValue VARCHAR(20) = 'Jason'
SELECT 'select count(*) from ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' WHERE ' + @ColumnName + ' = ' + CONVERT(VARCHAR(20), @VariableValue)
FROM INFORMATION_SCHEMA.columns
WHERE COLUMN_NAME = @ColumnName
在上面的代码之后,我将得到以下命令:
select count(*) from dbo.ClassA WHERE Student_Name = Jason
select count(*) from dbo.ClassB WHERE Student_Name = Jason
select count(*) from dbo.ClassC WHERE Student_Name = Jason
select count(*) from dbo.ClassD WHERE Student_Name = Jason
执行那些命令我会得到结果:
此代码的结果可能是,我想要的是这个数字的总和,5 + 1 + 0 + 0 + 1 = 7
答案 0 :(得分:0)
我建议您使用while循环,然后在while循环中工作。
答案 1 :(得分:0)
将生成的查询用作子查询:
'SELECT SUM(cnt) AS Total FROM (' + @InnerSQL + ')t'
您的最终查询应该是:
DECLARE @ColumnName VARCHAR(20) = 'Student_Name'
DECLARE @VariableValue VARCHAR(20) = 'Jason'
DECLARE @InnerSQL NVARCHAR(MAX) = ''
DECLARE @FinalSQL NVARCHAR(MAX) = ''
SELECT @InnerSQL = @InnerSQL +
'select count(*) as cnt from ' + TABLE_SCHEMA + '.' + TABLE_NAME + ' WHERE ' + @ColumnName + ' = @VariableValue UNION ALL' + CHAR(10)
FROM INFORMATION_SCHEMA.columns
WHERE COLUMN_NAME = @ColumnName
IF LEN(@InnerSQL) > 0 BEGIN
SELECT @InnerSQL = LEFT(@InnerSQL, LEN(@InnerSQL) - 11)
SELECT @FinalSQL =
'SELECT SUM(cnt) AS Total FROM(' + @InnerSQL + ' )t'
SELECT @FinalSQL
EXEC sp_executesql @FinalSQL, N'@VariableValue VARCHAR(20)', @VariableValue = @VariableValue
END
此外,您应该使用sp_executesql
执行动态SQL。
答案 2 :(得分:0)
使用以下查询
select SUM(cnt) from
(
select count(*) from dbo.ClassA WHERE Student_Name = Jason
UNION all
select count(*) as cnt from dbo.ClassB WHERE Student_Name = Jason
UNION all
select count(*) as cnt from dbo.ClassC WHERE Student_Name = Jason
UNION all
select count(*) as cnt from dbo.ClassD WHERE Student_Name = Jason
) as a