回答

收藏

表名作为变量

技术问答 技术问答 114 人阅读 | 0 人回复 | 2023-09-13

我正在尝试执行此查询:4 J8 @# f' H  a+ d& P$ _" v
declare @tablename varchar(50)  ]: _/ P8 {  ~; R, }
set @tablename = 'test'
3 r5 [3 X! Y, Z* L. Aselect * from @tablename
! [  I/ o* M; L2 n1 G& G% R这将产生以下错误:' r8 P# |9 I1 f6 I7 B) @9 N
0 q5 i( I" b1 P+ V: c' B5 Z
Msg 1087,第16级,状态1,第5行* ^4 ?" o9 r" r0 G
必须声明表变量“ @tablename”。
, m/ T, b8 P2 w9 W; s3 p" |! M
' {: p+ N( U* }- y/ o: k
动态填充表名的正确方法是什么?
/ f7 t: x1 Z7 y! M6 y& O5 Y                2 ~/ M- }1 S$ W, |  C6 n/ q6 G
解决方案:
6 b7 m5 v; D8 y               
# Q- ]8 |3 C2 N& ]/ v
- K6 B1 O# q' O9 J  r  ~  s. w: [
/ F1 Z. x1 t0 O# N                对于静态查询(如您的问题中的查询),表名和列名必须是静态的。
/ o4 d' q3 L, x% ^0 T5 a( a对于动态查询,应动态生成完整的SQL,并使用sp_executesql执行它。
( ^' S. B" i/ y, }: X这是一个脚本示例,用于比较不同数据库的相同表之间的数据:9 A' ]- E; }6 \: k: u
静态查询:' q5 X; t% K0 `3 W+ O2 n
SELECT * FROM [DB_ONE].[dbo].[ACTY]
4 ^  e$ B; V+ z3 f# OEXCEPT3 V) C! w8 {$ |8 O6 \
SELECT * FROM [DB_TWO].[dbo].[ACTY]
- l( C( H/ j" x由于我想轻松更改tableand的名称schema,因此创建了以下动态查询:
; _$ w% l/ g6 o" mdeclare @schema varchar(50)6 r# m3 T5 E, v
declare @table varchar(50)
) a5 t  W& T9 M% ~# W. g. D0 ^9 Gdeclare @query nvarchar(500)$ ^* ]0 [! C/ P9 y* m$ {# m9 ]# Z
set @schema = 'dbo', N: z( E; R! [* h6 r
set @table = 'ACTY'
  f% S3 X3 _1 v( Qset @query = 'SELECT * FROM [DB_ONE].[' + @schema + '].[' + @table + '] EXCEPT SELECT * FROM [DB_TWO].[' + @schema + '].[' + @table + ']'
- f( Q7 B$ a% X6 S+ s- gEXEC sp_executesql @query
3 \9 ~- P& C5 X% g由于动态查询具有许多需要考虑的细节并且难以维护,因此我建议您阅读:动态SQL的诅咒和祝福
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则