SQL 服务器 - return 动态查询结果的程序

SQL Server - Procedure to return results of dynamic Query

我有一个相当简单的存储过程需要return一个结果集,类似于(代码是真实代码的高度简化版本,但足以描述我的问题):

CREATE PROCEDURE MyProc(@Par1 VARCHAR(100)) 
AS
BEGIN
    SELECT A,B,C FROM MyTable ;
END ;

到目前为止,这非常有效,因为调用过程确实获得了 table 中所有记录的值 A、B 和 C。

现在,我需要允许添加通过接收到的参数 Par1 提供的 "conditions"(即 WHERE 子句)。为此,我声明了一个新的局部变量,旨在保存包含条件的完整 SQL select 语句,因此相同的过程现在看起来像:

CREATE PROCEDURE MyProc(@Par1 VARCHAR(100)) 
AS
BEGIN
    DECLARE @SQLSTT VARCHAR(1000) ;
    SET @SQLSTT = 'SELECT A,B,C FROM MyTable WHERE ' + @Par1 ;

    EXECUTE ( @SQLSTT );
END ;

ALMOST 工作:正确数量的记录受到影响,但它们没有传递给调用过程。

我考虑过使用临时 table(或 table 变量),但这将是一个不必要的开销,因为一旦记录被 selected,就没有进一步的在此过程中进行操作,只需传递给调用 SP。

所以,我的问题是:实现我想要的正确语法应该是什么?

提前致谢。

编辑

我发现了问题。它与程序无关(即 MyProc),而是与我试图查看 returned 结果的方式有关。快速修复,一切正常。

感谢大家花时间回答我的问题并发送 comments/suggestions/answers。

您必须在参数前使用@

更新流程如下

CREATE PROCEDURE MyProc(@Par1 VARCHAR(100)) 
AS
  BEGIN
     DECLARE @SQLSTT VARCHAR(1000) ;
     SET @SQLSTT = 'SELECT A,B,C FROM MyTable WHERE ' + @Par1 ;

     EXECUTE ( @SQLSTT );
  END ;

声明一个 table 来保存 return。

 declare @ret table (a int, b int, c int)
 insert into @ret
 EXECUTE ( @SQLSTT );

这很好用。我将其更改为使用 NVARCHAR。请检查您是如何使用适当的单引号调用该过程的:

CREATE PROCEDURE MyProc(@Par1 NVARCHAR(100)) 
AS

    DECLARE @SQLSTT NVARCHAR(1000) ;
    SET @SQLSTT = N'SELECT A,B,C FROM MyTable WHERE ' + @Par1 ;
    EXEC( @SQLSTT )

调用示例:

exec MyProc 'A <>''myvalue'''