其他方法使用表变量比动态查询
问题描述:
我有一个存储过程来计数记录数。其他方法使用表变量比动态查询
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
简单的查询,我必须使用表别名我的查询中,因为有许多连接。我不知道如何在动态查询中使用表别名。
我的问题:如果有办法使用表别名,任何其他方式来使用存储过程中的表变量?
答
什么是在动态SQL中有别名的大问题,为每个表名称变量分配别名。
SELECT @ActualTableName = QUOTENAME(TABLE_NAME) + ' as a'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @PassedTableName
确保您为涉及相同查询的表提供唯一的别名。
甚至里面动态查询,您可以提供别名
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ' as a ;'
答
/* 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
你走之前太远......如果这对于任何面对幅,停止,了解SQL注入及如何正确参数你的动态sql。你写的那种方式,你有点像一只坐着的鸭子。 –
不,仅限内部使用。为了简单起见,我们假设0安全需求。 –
是的...它应该很容易编码。问题是你如何计划实际使用它?您是否设置了某种界面,允许您使用选择列表或强迫自己记住架构的依赖部分?无论哪种情况,都应该忘记INFORMATION_SCHEMA视图...您希望使用暴露ID的sys.scema视图,以便从数据库,架构,到表格到列。 –