【问题标题】:sql select with tablename as variable以表名作为变量的 sql 选择
【发布时间】:2016-01-29 15:24:31
【问题描述】:

我有几个只能使用 sybase 访问的表。我需要编写一个查询,将数据从 7 月提取到指定的日期参数(例如 201507 - 201512)。输入日期参数​​后,我需要使用名称访问 sybase 上的表: ff_vv_201507_tt 到 ff_vv_201512_tt。

我虽然可能将 yyyymm 作为变量。我不确定如何实现这一点,因为我对 SQL 很陌生。

我尝试从 sybase 访问一个表,但我的代码似乎不起作用:

DECLARE @Table_Name sysname, @DynamicSQL nvarchar(4000)

SET @Table_Name = 'ff_vv_201507_tt'

SET @DynamicSQL =  'select 
*
FROM OPENQUERY(SADATABASE, 'select 
*
                       from  ' @Table_Name ' 
                                         )''

EXECUTE sp_executesql @DynamicSQL

非常感谢您的帮助。

谢谢

【问题讨论】:

  • 了解您使用的 Sybase 的产品和版本会很有帮助,因为并非所有产品都支持动态 SQL。如果您不确定,请使用select @@version 查找该信息。
  • Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (内部版本 7601:Service Pack 1)(管理程序)
  • 那你为什么要把Sybase放在标题和标签里呢?
  • Table name as variable的可能重复
  • 我相信 OP 正在 SQL Server 上执行,但另外使用 OPENQUERY 将一些信息从 SyBase 拉入 SQL Server。

标签: sql-server sql-server-2008 tsql dynamic-sql


【解决方案1】:

您可以在带有内联 sql 的 shell 脚本中执行此操作。 这样,您将轻松生成参数并将其传递给存储过程,并使用给定参数动态创建表 此类脚本的示例:

$PARAM="XXXXX"
$PARAM2="YYYYY"
ret=`$ISQL -U$SQL_USER -P$SQL_PASSWD << __XXX
set nocount on
go
use mydatabase
go

DECLARE @batchId INT
select @batchId = 99
exec myStoreProc @batchId, "${PARAM}", "${PARAM2}"
go
__XXX`

【讨论】:

  • 我也不明白这有什么意义
【解决方案2】:

如果你想在你的字符串中使用单引号,你需要通过使用两个单引号来“转义”它们。

SET @DynamicSQL =  'select * FROM OPENQUERY(SADATABASE,''select * from '+@Table_Name+''')'

为什么这么复杂这应该可以正常工作。

SET @DynamicSQL =  'select * FROM ' +@Table_Name 

EXECUTE @DynamicSQL

【讨论】:

  • 我已经尝试过了,但由于我使用的是 OPENQUERY,它似乎不起作用。
  • @MissR - 你有没有像我上面显示的那样转义你的单引号?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多