SQL SERVER 2008 Проблема динамических запросов - PullRequest
0 голосов
/ 21 сентября 2009

У меня динамический запрос, который выглядит так

Alter PROCEDURE dbo.mySP 
    -- Add the parameters for the stored procedure here
    (
        @DBName varchar(50),
        @tblName varchar(50)

    )

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

-- Insert statements for procedure here
declare @string as varchar(50)
declare @string1 as varchar(50)

set @string1  = '[' + @DBName + ']' + '.[dbo].' + '[' + @tblName + ']'

set @string = 'select * from ' + @string1   

exec @string

END

Я звоню вот так

dbo.mySP 'dbtest1','tblTest'

И у меня возникает ошибка

"Msg 203, Level 16, State 2, Procedure mySP, Line 27
The name 'select * from [dbtest1].[dbo].[tblTest]' is not a valid identifier."

Что не так? и как побороть?

Заранее спасибо

Ответы [ 4 ]

5 голосов
/ 21 сентября 2009

Предполагается, что содержимое @string относится к имени хранимой процедуры. Вам нужно поставить

EXEC (@string)

или лучше использовать хранимую процедуру sp_executesql

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

Подробнее о более безопасном динамическом SQL можно прочитать в моем блоге.

4 голосов
/ 21 сентября 2009

Изменение

exec @string

Для

exec(@string)

Вот рабочий SP, который я только что протестировал:

CREATE PROCEDURE [dbo].[test] 
    @DBName varchar(50),
    @tblName varchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @string AS VARCHAR(50)
    DECLARE @string1 AS VARCHAR(50)

    SET @string1 = '[' + @DBName + '].[dbo].[' + @tblName + ']'
    SET @string = 'select * from ' + @string1

    EXEC(@string)
END
1 голос
/ 21 сентября 2009

, если вы используете EXEC как:

EXEC @String

он пытается запустить процедуру с именем, содержащимся в переменной @String. попробуйте:

create procedure TestProc
as
print 'you called TestProc!'
go

declare @string varchar(20)
set @string='TestProc'

exec @string

если вы используете EXEC как:

EXEC (@Query)

вы запускаете sql в переменной @Query, попробуйте:

DECLARE @Query  varchar(50)
set @Query='Print ''just ran it!'''

EXEC (@Query)
0 голосов
/ 19 сентября 2011
ALTER PROCEDURE test_sp
    -- Add the parameters for the stored procedure here
    (
        @DBName varchar(50),
        @tblName varchar(50)

    )

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

-- Insert statements for procedure here
declare @string as varchar(100)
declare @string1 as varchar(50)

set @string1  = '[' + @DBName + ']' + '.[dbo].' + '[' + @tblName + ']'
Print @string1
set @string = 'select * from'  + @string1       
Print @string
exec (@string)
SET NOCOUNT OFF  
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...