我想制作一个可用的表,我可以在Microsoft sql Server Management studio上制作吗?



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

我该怎么做?????

您需要构建动态查询,因为表名不能是变量。对于这种情况,您可以使用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 

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

最新更新