我想制作一个表变量,我可以在 Microsoft sql server management studio 上制作它吗?
Posted
技术标签:
【中文标题】我想制作一个表变量,我可以在 Microsoft sql server management studio 上制作它吗?【英文标题】:I want to make a vairable of table can i make it on 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)
我该怎么做????
【问题讨论】:
尝试用它的结构声明一个变量/临时表,就像创建一个新表一样。稍后您可以在该表中插入、查询。 【参考方案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
【讨论】:
以上是关于我想制作一个表变量,我可以在 Microsoft sql server management studio 上制作它吗?的主要内容,如果未能解决你的问题,请参考以下文章
通过Microsoft Excel中的vlookup制作列表?
如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?
Microsoft Access 2013 - 表数据中的变量