将 sp_executesql 与 params 一起使用会抱怨需要声明变量

wil*_*e01 3 sql-server stored-procedures sql-server-2005

我正在尝试创建一个使用 sp_executesql 的存储过程。我在这里仔细观察了很长时间,但我看不出我在代码中做错了什么。一般来说,我对存储过程/sql 服务器功能很陌生,所以我猜我错过了一些简单的东西。存储过程更改发生得很好,但是当我尝试运行它时,出现错误。

错误说。

Msg 1087, Level 15, State 2, Line 3
Must declare the table variable "@atableName"
Run Code Online (Sandbox Code Playgroud)

该过程如下所示。

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[sp_TEST]
    @tableName varchar(50),
    @tableIDField varchar(50),
    @tableValueField varchar(50)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQLString nvarchar(500);
    SET @SQLString = N'SELECT DISTINCT @aTableIDField FROM @atableName';
    EXEC sp_executesql @SQLString,
            N'@atableName varchar(50),
              @atableIDField varchar(50),
              @atableValueField varchar(50)',
            @atableName = @tableName,
            @atableIDField = @tableIDField,
            @atableValueField = @tableValueField;
END
Run Code Online (Sandbox Code Playgroud)

我正在尝试用这样的方式来称呼它。

EXECUTE sp_TEST 'PERSON', 'PERSON.ID', 'PERSON.VALUE'
Run Code Online (Sandbox Code Playgroud)

此示例没有添加任何特殊内容,但我有大量具有类似代码的视图。如果我能让这个存储过程正常工作,我就可以大大减少大量重复代码。

感谢您的帮助。

编辑:我尝试这样做是为了更容易维护。我有多个视图,它们基本上具有完全相同的 sql,只是表名不同。数据被传送到 SQL Server 实例以用于报告目的。当我有一个表,每个人的 ID 包含多行,每行都包含一个值时,我经常需要将它们放在一个单元格中供用户使用。

gbn*_*gbn 5

您无法参数化表名,因此它将因@atableName而失败

您需要将第一位与 atableName 连接起来,这违背了使用 sp_executesql 的目的