动态SQL(通过表名作为参数)(Dynamic SQL (passing table name as

2019-06-18 21:56发布

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

例如:

@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不正确的语法。

Answer 1:

嗯,首先你从你的字符串中省略了“+”。 做事的方式是远远不够理想,但你可以做

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

我强烈建议重新考虑你是怎么做到这一点,但是。 生成动态SQL往往导致SQL注入漏洞以及使其更难的SQL Server(和其他的DB)制定出处理您的查询的最佳方式。 如果你有一个存储过程可以返回任何表,你真正得到几乎没有从它正在因为它不能做太多的优化的方式首先是一个存储过程的好处,而你主要是阉割的安全好处。



Answer 2:

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

但要确保你完全了解风险,如SQL注入攻击。 在一般情况下,你不应该曾经有使用这样的事情,如果DB是精心设计的。



Answer 3:

难道你的意思

Exec('SELECT * FROM ' + @tableName) 

此外,你的错误是因为你已经忘记了+ @Alias之前。



Answer 4:

通常情况下,不必参数表名表示应该重新考虑你的数据库模式。 如果你拉从许多不同的表的面试问题,它可能是最好创建一个表以任何方式对不同的表将有问题之间的区分列。



Answer 5:

大多数SQL实现不允许你指定的结构元素 - 表名,字段名,顺序按列等 - 通过参数; 你必须使用动态SQL参数化查询的那些方面。

然而,看着SQL,您有:

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

毫无疑问,这将意味着代码仅会从一个名为“表”表中选择,你需要用它来连接的@Alias -在许多SQL方言,串联由'表示|| “:

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

这仍然可能不会做你想要的 - 但在创建过程时,它可能不会产生一个语法错误(但它可能会在运行时生成一个错误)。



文章来源: Dynamic SQL (passing table name as parameter)