0

我想在存储过程中创建一个表变量来调用来自 3 个不同表的数据,比如我在文本框中有城市名称和一个包含表名值的下拉列表,

我已经做了一个存储过程:

[dbo].[sp_Search]
@City nvarchar(50) = null
AS
SELECT * FROM PropertyForSale_TBL  WHERE (City =    @City OR @City IS NULL)

这是仅适用于文本框的 SP,不适用于下拉列表。

我想要一个将表名作为变量的过程,所以当我选择下拉列表时,它会调用该表中的数据。就像我想象的那样,它的作品可能是这样的......

[dbo].[sp_Search]
@City nvarchar(50) = null,
@Tablename Table (maybe or maybe not i dont know it is not working)

AS
SELECT * FROM @Tablename  WHERE (City = @City OR @City IS NULL)

我怎样才能做到这一点?????

4

2 回答 2

2

您需要构建动态查询,因为表名不能是变量。对于这种情况,您可以使用sp_executesql如下所示运行动态查询。

您可以使用它进行参数化查询,sp_executesql以避免任何 SQL 注入威胁。

create procedure [dbo].[sp_search] 
   @City      nvarchar(50) = null, 
   @Tablename varchar(100) 
as 
  begin 
      declare @sql nvarchar(max)
      set @sql = N'SELECT * FROM ' +  quotename(@Tablename) 
             + '  WHERE (City = @City OR @City IS NULL)' 
      exec sp_executesql 
        @sql, 
        N'@City nvarchar(50)',       
        @City 
  end 
于 2018-05-02T09:10:56.337 回答
0

您可以构建动态 SQL 并执行它

这是一个简单的例子(注意有多种方法可以执行动态 SQL,每种方法都有自己的优点和缺点,做一点研究)

DECLARE @City       NVARCHAR(50) = 'New York'
      , @TableName  VARCHAR(100) = 'PropertyForSale_TBL'


DECLARE @SQL NVARCHAR(MAX) = 
    'SELECT * FROM ' + QUOTENAME(@Tablename) + ' WHERE [City] = ''' + @City + ''''

PRINT @SQL -- SELECT * FROM [PropertyForSale_TBL] WHERE [City] = 'New York'

EXEC (@SQL)

编辑:也只是一个注释动态代码通常不是最好的主意。上面的内容让您面临 SQL 注入和其他令人头疼的问题。看看你的数据库结构,看看数据是否可以放在同一个表、IF 语句和使用的临时表或多个存储过程中。

于 2018-05-02T09:08:55.900 回答