Использование sp_executesql с params жалуется на необходимость объявления переменной - PullRequest
2 голосов
/ 10 марта 2011

Я пытаюсь создать хранимую процедуру, которая использует sp_executesql.Я долго и упорно здесь , но я не могу видеть, что я делаю неправильно в моем коде.Я новичок в хранимых процедурах / SQL Server функции в целом, поэтому я предполагаю, что я пропускаю что-то простое.Хранимая процедура alter происходит нормально, но когда я пытаюсь ее запустить, я получаю сообщение об ошибке.

В сообщении об ошибке.

Msg 1087, Level 15, State 2, Line 3
Must declare the table variable "@atableName"

Процедура выглядит следующим образом.

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

И я пытаюсь назвать это как-то так.

EXECUTE sp_TEST 'PERSON', 'PERSON.ID', 'PERSON.VALUE'

В этом примере не добавляется ничего особенного, но у меня есть большое количество представлений, имеющих похожий код.Если бы я мог заставить эту хранимую процедуру работать, я мог бы значительно сократить многократный код.

Спасибо за вашу помощь.

Редактировать: Я пытаюсь сделатьэто для облегчения обслуживания.У меня есть несколько представлений, которые в основном имеют одинаковый точный sql за исключением того, что имя таблицы отличается.Данные передаются на экземпляр сервера SQL для отчетности.Когда у меня есть таблица, содержащая несколько строк на идентификатор человека, каждая из которых содержит значение, я часто нуждаюсь в них в одной ячейке для пользователей.

Ответы [ 3 ]

3 голосов
/ 10 марта 2011

Это будет работать, но не рекомендуется, если вы просто не пытаетесь учиться и экспериментировать.

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 ' + quotename(@TableIDField) + ' FROM ' + quotename(@tableName);
    EXEC sp_executesql @SQLString;
END

Чтение Проклятие и благословения динамического SQL

3 голосов
/ 10 марта 2011

Вы не можете параметризовать имя таблицы, поэтому оно не будет работать с @ atableName

Вам необходимо объединить первый бит с atableName, что побеждает цель с использованием sp_executesql

2 голосов
/ 10 марта 2011

Нельзя использовать переменные для передачи имен таблиц и столбцов динамическому запросу в качестве параметров. Если бы это было возможно, мы бы не использовали динамические запросы для этого!

Вместо этого вы должны использовать переменные для построения динамического запроса. Как это:

SET @SQLString = N'SELECT DISTINCT ' + QUOTENAME(@TableIDField) +
                  ' FROM ' + QUOTENAME(@TableName);

Параметры используются для передачи значений , обычно для использования в условиях фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...