【问题标题】:I want to make a vairable of table can i make it on Microsoft sql server management studio?我想制作一个表变量,我可以在 Microsoft sql server management studio 上制作它吗?
【发布时间】:2018-10-12 07:55:47
【问题描述】:

我想在存储过程中创建一个表变量来调用来自 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)

我该怎么做????

【问题讨论】:

  • 尝试用它的结构声明一个变量/临时表,就像创建一个新表一样。稍后您可以在该表中插入、查询。

标签: sql asp.net variables stored-procedures mysql-variables


【解决方案1】:

您可以构建动态 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 语句和使用的临时表,或多个存储过程中。

【讨论】:

    【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2014-05-20
      • 2018-06-21
      • 2010-09-14
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多