ここでも安全にSQLインジェクションisuuesに対処し、それを行うための別の方法です:
/* Counts the number of rows from any non-system Table, *SAFELY* */
-- The table name passed
DECLARE @PassedTableName as NVarchar(255) = 'Person.Person';
-- Make sure this isn't a SQL Injection attempt
DECLARE @ActualTableName AS NVarchar(255)
SELECT @ActualTableName = TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = PARSENAME(@PassedTableName,1)
AND TABLE_SCHEMA = PARSENAME(@PassedTableName,2)
-- make a temp table to hold the results
CREATE TABLE #tmp(cnt INT);
-- create the dynamic SQL
DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'
-- execute it and store the output into the temp table
INSERT INTO #tmp(cnt)
EXEC(@SQL);
-- Now, finally, we can get it into a local variable
DECLARE @result AS INT;
SELECT @result = cnt FROM #tmp;
あなたはこのために、動的SQLを使用したくないのはなぜ... – scsimon
私は思いますが絶対に避けられない限り、動的SQLの使用は避けてください。あなたはオートコンプリートもなくなり、全体としてエラーが発生しやすくなります。 – user2366842
また、SQLインジェクションの問題もあります。あなたが無視してはいけない非常に大きな問題です。 – RBarryYoung