sql server 用变量定义表名,能够查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 用变量定义表名,能够查询相关的知识,希望对你有一定的参考价值。

alter procedure proc_select
@table varchar(50)
as
declare @sql varchar(max)
begin
set @sql='select * from'+@table
@sql
print @sql
end
这个上面@sql只能够显示select * from @table ,我想叫它查询某个表,不知道该怎么做?

sql server 中查询使用变量定义表名,需要配合exec()来实现。


如图中例子,使用 @char_table 接收 表名变量


SQL中:declare @ 定义变量,set 给变量赋值。exec()来执行动态SQL语句

参考技术A set @sql='select * from'+@table
print @sql
exec @sql --执行SQL

追问

这个@sql不是存储过程,没法执行啊!

追答

可以的,exec可以用来执行语句的

上面写错了,要这样

set @sql='select * from '+@table
print @sql
exec(@sql)

本回答被提问者采纳

SQL Server 查询中的动态表名和变量名

【中文标题】SQL Server 查询中的动态表名和变量名【英文标题】:Dynamic table name and variable name in query in SQL Server 【发布时间】:2018-08-10 10:38:49 【问题描述】:

我正在尝试使用动态表名和日期从 Python 运行查询。在此过程中,我在 SSMS 中尝试了以下查询,但它产生了错误消息。如何将变量用于表名和日期,并让查询正常工作?

DECLARE @table_name VARCHAR(50)='table_name';
DECLARE @valid_to datetime = getdate();

EXEC('UPDATE '+ @table_name + '
SET valid_flag = 0, 
valid_to = '+ @valid_to +'
where valid_flag=1')

我收到以下错误消息:

消息 102,第 15 级,状态 1,第 3 行 '10' 附近的语法不正确

【问题讨论】:

UPDATE 后面少了一个空格。 除了许多其他缺陷之外,这很明显来自这里:valid_to = '+ @valid_to +'。您的@valid_to 被声明为datetime,并且不能成为+ 字符串连接的一部分。但是CAST 不能解决这个问题(日期格式、引号......)正确的解决方案来自 Gordon:使用参数并使用QUOTENAME()! (或meet bobby tables) 【参考方案1】:

使用sp_executesql和参数:

DECLARE @table_name VARCHAR(50) = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ @table_name + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;

编辑:

根据 Larnu 的推荐评论:

DECLARE @table_name sysname = 'table_name';
DECLARE @valid_to datetime = getdate();

DECLARE @sql NVARCHAR(max) = N'
UPDATE '+ QUOTENAME(@table_name) + N'
    SET valid_flag = 0, 
        valid_to = @valid_to
    WHERE valid_flag = 1
';

EXEC sp_executesql @sql, N'@valid_to datetime', @valid_to=@valid_to;

【讨论】:

我建议 sysname 超过 varchar(50),以防 OP 确实有一个名称更长的对象。您绝对应该使用QUOTENAME,但 SQL 注入不是您的朋友。但至少 WHERE 是参数化的。

以上是关于sql server 用变量定义表名,能够查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询中的动态表名和变量名

sql server存储过程如何动态生成表名

oracle查询表名为一个变量怎么写

用sql语句查找某一行的一个值并返回那个值,怎么写? 请将详细点 ,谢谢

sql中的变量定义

oracle中表名能否用变量?怎么用