将值传递到 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
它应该可以正常工作。
我正在尝试将变量 @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
它应该可以正常工作。