我想在存储过程中创建一个表变量来调用来自 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 语句和临时表中,或者放在多个存储过程中。