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过程时产生语法错误(但是在运行时可能会产生错误)。