繁体   English   中英

SQL SERVER 2008动态查询问题

[英]SQL SERVER 2008 Dynamic query problem

我有这样的动态查询

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

结束

我这样打

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."

怎么了? 以及如何克服?

提前致谢

它认为@string的内容引用存储过程名称。 你需要放

EXEC (@string)

或更好地使用存储过程sp_executesql

您还应该设置一些保护代码,以检查所传递的值是真实表和数据库的名称。 您可以在INFORMATION_SCHEMA中查询视图以验证输入。

您可以在我的博客上阅读有关更安全的动态SQL的更多信息。

更改

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

如果将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)

您在@Query变量中运行sql,请尝试一下:

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

EXEC (@Query)
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM