将值传递到 T-SQL 中的存储过程

Pass value into stored procedure in T-SQL

我正在尝试将变量 @date 传递到我的 T-SQL 命令中(在 Synapse 的 DB 中)。我想要它做的是在用户定义的给定日期之前从 table 中删除数据。

这是我的脚本,当我在其中定义日期时,它工作得很好:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [DPIT].[proc_nhs_delete_by_date] @date datetime, @TableName sysname AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON

DECLARE @SchemaName sysname;

SET @SchemaName = N'DPIT';

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'DELETE FROM ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N' WHERE datum = @date;';
EXEC sys.sp_executesql @SQL, N'@date datetime', @date

END

但是当我执行这个存储过程并将参数传递给它时,我得到以下错误:

Parse error at line: 3, column: 1: Incorrect syntax near 'EXEC'.

这是造成错误的代码:

DECLARE @return_value int

EXEC    @return_value = [DPIT].[proc_nhs_delete_by_date]
        @date = N'20231021',
        @TableName = sluzba_G

SELECT  'Return Value' = @return_value

GO

您知道问题出在哪里吗?我倾向于认为问题在于 Synapse 可能不支持 EXEC 命令,我将不得不以某种方式使用 sys.sp_executesql,但老实说,我不知道如何使用。

非常感谢您的帮助!

@Larnu 的评论需要强调:

Why are you using "dynamic" SQL here, when the names of the objects are static; you assign the variable a static value. There's not need for this logic

您的代码非常复杂,可怕(动态 SQL 应该让每个人都感到恐惧!)。

您的代码可以简化为:

ALTER PROCEDURE DPIT.proc_nhs_delete_by_date (
 @date datetime
)
  AS
BEGIN
  SET NOCOUNT ON;

  DELETE
  FROM   dbo.some_table
  WHERE  datum = @date
  ;
END
;

动态 SQL 除了,您遇到的问题是工具。您不能使用 return.

在 Synapse Dedicated SQL 池(SQW 数据仓库)中以默认的 SSMS 方式调用存储过程

改变这个:

DECLARE @return_value int

EXEC    @return_value = [DPIT].[proc_nhs_delete_by_date]
        @date = N'20231021',
        @TableName = sluzba_G

SELECT  'Return Value' = @return_value

GO

为此:

EXEC    [DPIT].[proc_nhs_delete_by_date]
        @date = N'20231021',
        @TableName = sluzba_G

它应该可以正常工作。