Как отладить ошибку процедуры `Необходимо объявить табличную переменную" @ table1 ". - PullRequest
0 голосов
/ 26 сентября 2019
CREATE PROC AllRowsAndagain
@table1 NVARCHAR(128)

AS
BEGIN
  select count(*) FROM @table1  
END; 

Я получаю эту ошибку -

Сообщение 1087, Уровень 16, Состояние 1, Процедура AllRowsAndagain11, Строка 9 [Стартовая строка запуска 0]Необходимо объявить табличную переменную "@ table1".

Я хочу передать имя таблицы здесь в качестве параметра

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Как многие намекали в комментариях, вам нужно будет использовать динамический SQL.Однако динамический SQL может быть небезопасным, и вам следует избегать его использования.

Чтобы ответить на ваш вопрос, вам необходимо использовать что-то вроде этого:

CREATE PROCEDURE AllRowsAndagain
    @table1 NVARCHAR(128)

AS
BEGIN

    DECLARE @SafeTableName AS NVARCHAR(128)

    SELECT @SafeTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @table1

    DECLARE @sql AS NVARCHAR(MAX) = 'select count(*) from ' + @SafeTableName + ';'

    EXEC(@SQL)

END

Проверка таблицы на соответствие INFORMATION_SCHEMA.TABLESделает ваш динамический SQL намного безопаснее.Поскольку динамический оператор будет выполняться только в том случае, если в качестве переменной была передана таблица, а не какой-либо вредоносный оператор.

2 голосов
/ 26 сентября 2019

Нельзя использовать переменную для замены имени таблицы.Вы должны будете использовать динамический код для этого.К счастью, есть более эффективный способ получить количество строк из любой таблицы.

CREATE PROC AllRowsAndagain
(
  @table1 NVARCHAR(128)
)
AS
BEGIN

  SELECT SUM(row_count) AS row_count
  FROM sys.dm_db_partition_stats
  WHERE OBJECT_NAME( object_id) = @table1
  AND index_id IN (0,1);
END; 
0 голосов
/ 26 сентября 2019

Ваша проблема в том, что вы пытаетесь подсчитать количество строк в строковой переменной.Кажется, немного OTT, но вот вы .......

CREATE PROC AllRowsAndagain
@table1 NVARCHAR(128)

AS
BEGIN
  --DECLARE A VARIABLE TO HOLD THE STATEMENT
  DECLARE @Statement NVARCHAR(1024);

  --BUILD THGE STATMENT USING THE TABLE NAME YOU PASS IN
  SET @Statement = CONCAT('SELECT COUNT(*) FROM ', @table1, ';');
  --ONLY RUN FIRST COMMAND
  SET @Statement = SUBSTRING(@Statement, 1, CHARINDEX(';', @Statement));
  --RUN THE SQL
  exec sp_executesql @Statement;
END; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...