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