【问题标题】:stored proc not really returning anything存储过程并没有真正返回任何东西
【发布时间】:2018-04-25 13:20:13
【问题描述】:

使用 sql server,在 Azure 中。

a 请求存储过程从开发人员那里返回下一个数字。

这是他们返回的。

BEGIN

exec ('
SELECT 
  (
    SELECT FORMAT(getdate(),agencyFormat) FROM [dbo].[tblCardNextNum]     WHERE agencyID = '+@agencyID+' and type = '''+@type+''') + 
    FORMAT(NEXT VALUE FOR [dbo].['+@agencyShort+'], 
      (
        SELECT REPLICATE(''0'',
        (
          SELECT [agencyMaxLength] FROM [dbo].[tblCardNextNum] WHERE   agencyID = '+@agencyID+' and type = '''+@type+'''
        )
      )
    )
  )
')

END

现在当我在 ssms 中执行存储过程时,它会显示下一个数字,但它不会返回任何内容,只会显示它。

所以我的问题是......

我要在这个存储过程中添加什么才能真正将新创建的数字返回给调用函数?

致那些询问调用此存储过程的人...

EXEC [dbo].[GetCrudAgencyNextNum]
    @agencyShort = N'PLFD',
    @agencyID = 2,
    @type = N'C'

小屏幕截图

不,这不是 MVC 解决方案的副本 - 我看过。

我的问题是.. 我要在这个存储过程中添加什么来返回值。

【问题讨论】:

  • 通常返回值的一个好的起点是在查询中实际包含单词 return。另外,谷歌“SQL Server Return”。
  • 在SSMS中,你认为显示结果和返回结果有什么区别?如果您正确执行,可能会按原样在您的调用函数中获得结果。但是您还没有向我们展示调用函数。
  • 该代码正在调用序列ID,使用动态代码。请首先发布所有代码,而不仅仅是部分代码。我认为操作是指Messages 选项卡与Results 选项卡的显示。
  • 我建议参数化你的 SQL;它现在对注射敞开大门。

标签: sql-server


【解决方案1】:

这里有很多的猜测,因为代码图像没有帮助。

首先,就像我在 cmets 中所说的,请参数化您的 SQL;像这样连接字符串是一个等待发生的注入问题。现在是 2018 年,这种糟糕的做法应该成为过去。

接下来,SP 的返回值要么是 0,要么是 1,就是这样。如果要输出到变量,请使用OUTPUT 参数。

以下内容应该能让您走上正确的道路,但是,它未经测试

CREATE PROC YourProc @AgencyShort sysname, @AgencyID int, @Type nchar(1), @Return bigint OUTPUT AS --I have GUESSED your datatypes
BEGIN


    DECLARE @SQL nvarchar(MAX);
    DECLARE @Params nvarchar(MAX);

    SET @SQL = N'SELECT @dReturn = (SELECT FORMAT(getdate(),agencyFormat)' + NCHAR(10) +
               N'                   FROM [dbo].[tblCardNextNum]' + NCHAR(10) +
               N'                   WHERE agencyID = @dAgencyID' + NCHAR(10) +
               N'                     AND type = @dtype) + ' + NCHAR(10) +
               N'                   FORMAT(NEXT VALUE FOR [dbo].' + QUOTENAME(@agencyShort) + N' (SELECT REPLICATE(''0'',(SELECT [agencyMaxLength]' + NCHAR(10) +
               N'                                                                                                         FROM [dbo].[tblCardNextNum]' + NCHAR(10) +
               N'                                                                                                         WHERE agencyID =  @dAgencyID' + NCHAR(10) +
               N'                                                                                                           AND type = @dType))));';
    PRINT @SQL; --Your Best Friend
    SET @Params = N'@dAgencyID int, @dType nchar(1), @dReturn bigint OUTPUT'; -- I have GUESSED your datatypes
    EXEC sp_executesql @SQL, @Params, @dAgencyID = @AgencyID, @dType = @Type, @dReturn = @Return OUTPUT;
END
GO

DECLARE @Return bigint;
EXEC YourProc N'PLFD',2, N'C', @Return OUTPUT;
SELECT @Return AS [Return];

如果这不起作用,您最好的朋友会为您提供帮助。

【讨论】:

    【解决方案2】:

    在将存储过程踢回 DBA 之后......他们重写了它,现在我们有了一个可以工作的存储过程 YEA!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2020-05-17
      • 2019-04-22
      相关资源
      最近更新 更多