Хранимая процедура не возвращает результат - PullRequest
0 голосов
/ 28 марта 2020

Я определил две хранимые процедуры, которые должны возвращать набор данных, первая работает отлично, вторая работает без ошибок, но не возвращает никакого набора результатов, почему?

Хранимая процедура # 1: возвращает и отображает набор записей:

-- Counts the number of rows from any non-system Table, *SAFELY*
CREATE PROCEDURE spCountAnyTableRows(@PassedTableName as varchar(255))
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ActualTableName AS NVARCHAR(255)
    DECLARE @sql AS NVARCHAR(MAX)

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

    SELECT @sql='SELECT COUNT(*) FROM AS cnt' + @PassedTableName

    EXECUTE(@sql)

    RETURN
END

EXEC spCountAnyTableRows 'tmp.myTable'

Хранимая процедура # 2: выполняется без ошибок, но не возвращает никаких данных

DROP PROCEDURE IF EXISTS npi.spJoinOnMatnr
GO

CREATE PROCEDURE npi.spJoinOnMatnr(@PassedTableName AS NVARCHAR(255))
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ActualTableName AS NVARCHAR(255)
    DECLARE @sql AS NVARCHAR(MAX)

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

    SELECT @sql = 'SELECT A.id, A.F1, B.maktx, B.maktx_cnt
                   FROM ' + @ActualTableName + ' A
                   LEFT JOIN npi.makt B ON A.F1 = B.matnr
                   ORDER BY A.id;'

    EXECUTE(@sql)

    RETURN
END
GO

EXEC npi.spJoinOnMatnr 'tmp.myTable'

1 Ответ

2 голосов
/ 28 марта 2020

Хорошей практикой является возвращение динамического c запроса:

CREATE PROCEDURE ...
  @Debug BIT  = 0
BEGIN

   IF @Debug = 1 PRINT @sql;
END

Во-вторых, я полагаю, вам не хватает схемы для @ActualTableName, поскольку это только имя таблицы.


Вы передаете 2 имени части 'tmp.myTable':

SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName  -- table name contains only `myTable`

Я предлагаю передать 2 параметра явно @schemaName и @tableName

...