如何使用查询SQL

时间:2016-03-29 06:42:12

标签: sql-server

我使用下面的查询从我的数据库中的所有表中查找学生名称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

enter image description here

3 个答案:

答案 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