2017-10-10 46 views
0

我有一个存储过程来计数记录数。其他方法使用表变量比动态查询

CREATE PROCEDURE spCountAnyTableRows 
    (@PassedTableName as NVarchar(255)) 
AS 
    -- Counts the number of rows from any non-system Table, *SAFELY* 
BEGIN 
    DECLARE @ActualTableName AS NVarchar(255) 

    SELECT @ActualTableName = QUOTENAME(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @PassedTableName 

    DECLARE @sql AS NVARCHAR(MAX) 
    SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';' 

    EXEC(@SQL) 
END 

现在,我想用更复杂的查询,以取代在上面定义@sql简单的查询,我必须使用表别名我的查询中,因为有许多连接。我不知道如何在动态查询中使用表别名。

我的问题:如果有办法使用表别名,任何其他方式来使用存储过程中的表变量?

+0

你走之前太远......如果这对于任何面对幅,停止,了解SQL注入及如何正确参数你的动态sql。你写的那种方式,你有点像一只坐着的鸭子。 –

+0

不,仅限内部使用。为了简单起见,我们假设0安全需求。 –

+0

是的...它应该很容易编码。问题是你如何计划实际使用它?您是否设置了某种界面,允许您使用选择列表或强迫自己记住架构的依赖部分?无论哪种情况,都应该忘记INFORMATION_SCHEMA视图...您希望使用暴露ID的sys.scema视图,以便从数据库,架构,到表格到列。 –

回答

0

什么是在动态SQL中有别名的大问题,为每个表名称变量分配别名。

SELECT @ActualTableName = QUOTENAME(TABLE_NAME) + ' as a' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = @PassedTableName 

确保您为涉及相同查询的表提供唯一的别名。

甚至里面动态查询,您可以提供别名

SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ' as a ;' 
0
/* This Script is use to Fetch To count the Numbers of rows in Table */ 
CREATE TABLE #rowcount (tablename VARCHAR(128), cnt INT) 
EXEC sp_MSforeachtable 
@command1 = 'Insert into #rowcount select ''?'', 
       count(*) from ?', 
@whereand = 'and o.name = ''Table_Name''', -- Table_Name 
@postcommand = 'SELECT * from #rowcount Where Cnt >0 Order by tablename' 

DROP TABLE #rowcount 

OR YOU Can Get All Table Row Count by removing Where clause 

CREATE TABLE #rowcount (tablename VARCHAR(128), cnt INT) 
EXEC sp_MSforeachtable 
@command1 = 'Insert into #rowcount select ''?'', 
       count(*) from ?', 
@postcommand = 'SELECT * from #rowcount Where Cnt >0 Order by tablename' 

DROP TABLE #rowcount 
相关问题