动态SQL(将表名作为参数传递)

Gur*_*epS 13 t-sql sql-server

我想编写一个存储过程,它将使用一个参数,它将是表名.

例如:

@tablename << Parameter

SELECT * FROM @tablename
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

我写了这个:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[GetAllInterviewQuestions]
@Alias varchar = null
AS
BEGIN
Exec('Select * FROM Table as ' @Alias) 
END
Run Code Online (Sandbox Code Playgroud)

但它说@Alias附近的语法不正确.

Mar*_*rtW 19

好吧,首先你从字符串中省略了'+'.这种做事方式远非理想,但你可以这样做

DECLARE @SQL varchar(250)
SELECT @SQL = 'SELECT * FROM ' + QuoteName(@Alias)
Exec(@SQL)
Run Code Online (Sandbox Code Playgroud)

不过,我强烈建议你重新考虑如何做到这一点.生成动态SQL通常会导致SQL注入漏洞,并使SQL Server(和其他数据库)更难以找到处理查询的最佳方法.如果你有一个可以返回任何表的存储过程,那么它实际上几乎没有从它作为存储过程中获益,因为它无法在优化方面做很多事情,而且你是在很大程度上也贬低了安全利益.