我想编写一个存储过程,它将使用一个参数,它将是表名.
例如:
@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(和其他数据库)更难以找到处理查询的最佳方法.如果你有一个可以返回任何表的存储过程,那么它实际上几乎没有从它作为存储过程中获益,因为它无法在优化方面做很多事情,而且你是在很大程度上也贬低了安全利益.