dynamicSQL(传递表名作为参数)

我想写一个存储过程将使用一个参数,这将是表名。

例如:

@tablename << Parameter SELECT * FROM @tablename 

这怎么可能?

我写了这个:

 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 

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

那么,首先你从string中省略了“+”。 这种做事方式远非理想,但你可以做到

 DECLARE @SQL varchar(250) SELECT @SQL = 'SELECT * FROM ' + QuoteName(@Alias) Exec(@SQL) 

但是,我强烈build议重新考虑如何做到这一点。 生成dynamicSQL通常会导致SQL注入漏洞,并使SQL Server(和其他数据库)难以处理查询的最佳方式。 如果你有一个可以返回任何表的存储过程,那么你实际上从它作为一个存储过程开始就没有任何好处,因为它无法在优化方面做很多事情,在很大程度上削弱了安全性的好处。

你必须这样做: exec('select * from '+@tablename+' where...')

但是请确保您完全理解SQL注入攻击等风险。 一般来说,如果数据库devise得好,你不应该使用类似的东西。

你不是这个意思吗

 Exec('SELECT * FROM ' + @tableName) 

另外,你得到的错误是因为你在@Alias之前忘记了一个+

通常,不得不参数化表名,表明你应该重新考虑你的数据库模式。 如果你正在从许多不同的表中抽取面试问题,那么最好创build一个表格,用不同表格的问题来区分问题。

大多数SQL实现不允许你指定结构元素 – 表名,列名,按列sorting等等 – 通过参数; 您必须使用dynamicSQL来对查询的这些方面进行参数化。

然而,看着SQL,你有:

 Exec('SELECT * FROM Table AS ' @Alias) 

当然,这意味着代码只能从一个名为“Table”的表中select,而且你需要将@Alias和它连接起来 – 在许多SQL方言中,连接用“ || ”表示。 “:

 Exec('SELECT * FROM Table AS ' || @Alias) 

这仍然可能不会做你想要的 – 但是它可能不会在创build过程时产生语法错误(但是在运行时可能会产生错误)。