存储过程未返回结果

时间:2020-03-28 11:01:29

标签: sql sql-server stored-procedures

我已经定义了两个存储过程,这些存储过程应该返回一组数据,第一个可以完美运行,第二个可以正常运行,但是不返回任何结果集,为什么?

存储过程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 个答案:

答案 0 :(得分:2)

返回动态查询是一个好习惯:

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`

我建议显式传递两个参数@schemaName@tableName

相关问题