动态SQL能做到吗?
我有一个名为AskLists的表,其中包含两个字段:动态SQL能做到吗?,sql,sql-server,dynamic-sql,Sql,Sql Server,Dynamic Sql,我有一个名为AskLists的表,其中包含两个字段: AskListId AskInterview 2032 5 2032 3 2032 4 2032 6 5076 1 5076 3 5076 4 5076 5 5076 6 对于字段AskListId的每个不同编号,都有一个以编号AskList'number'命名的表 例如AskList5076: AskInterview QUOTA7 1 5660424 2 56604
AskListId AskInterview
2032 5
2032 3
2032 4
2032 6
5076 1
5076 3
5076 4
5076 5
5076 6
对于字段AskListId的每个不同编号,都有一个以编号AskList'number'命名的表
例如AskList5076:
AskInterview QUOTA7
1 5660424
2 5660424
3 5660424
4 5667511
5 5667511
6 5667511
7 5667511
所以有上百张表都是“数字”。
我试图将每个AskList'Number'表中的字段QUOTA7添加到主表AskLists中。
对于一张桌子,很容易:
SELECT AskListId
, AskInterview
,AskList5076.QUOTA7
FROM [Lists].[dbo].[AskLists]
INNER JOIN AskList5076 on AskLists.AskInterview = AskList5076.AskInterview
但我需要为AskListId中的所有值创建它是否可以在不手动发出数百个请求的情况下执行此操作?
有人告诉我动态SQL可以做到,但我不知道这一点。看看下面的内容,看看这是否适合您。它可能需要一些轻微的调整,当然也需要修改才能成为一个更新,但是在上面所示的所需查询的上下文中,这应该为您提供每个表的值
declare @sql nvarchar(max)=''
select @sql +='
select al.AsklistId, al.AskInterview, aq.quota7
from lists.dbo.AskLists al join '
+ QuoteName(table_name)
+ ' on al.AskInterview=aq.AskInterview'
+ Iif(Count(*) over()=Row_Number() over(order by (select null)),'',' union all')
from INFORMATION_SCHEMA.COLUMNS
where table_name like 'Asklist%'
and table_name != 'Asklist'
and column_name='QUOTA7'
print @sql
-- exec sp_executesql @sql
看看下面的内容,看看这是否适合你。它可能需要一些轻微的调整,当然也需要修改才能成为一个更新,但是在上面所示的所需查询的上下文中,这应该为您提供每个表的值
declare @sql nvarchar(max)=''
select @sql +='
select al.AsklistId, al.AskInterview, aq.quota7
from lists.dbo.AskLists al join '
+ QuoteName(table_name)
+ ' on al.AskInterview=aq.AskInterview'
+ Iif(Count(*) over()=Row_Number() over(order by (select null)),'',' union all')
from INFORMATION_SCHEMA.COLUMNS
where table_name like 'Asklist%'
and table_name != 'Asklist'
and column_name='QUOTA7'
print @sql
-- exec sp_executesql @sql
在加入表之前,可以使用动态SQL将所有表合并在一起
- 从根本上说,就是把它们放在一开始就应该具备的结构风格中
像这样的东西(它不仅仅是一个有点黑)
DECLARE@union-NVARCHAR(最大值)
挑选
@联合=
字符串_AGG(
强制转换(N'SELECT'.+TABLE_NAME+N''作为源_表,*来自'.+TABLE_CATALOG+N'.+TABLE_SCHEMA+N'.+TABLE_NAME作为NVARCHAR(MAX)),
CHAR(13)+CHAR(10)+N'UNION ALL'+CHAR(13)+CHAR(10)
)
从…起
信息\u SCHEMA.TABLES
哪里
表\u名称,如“AskList%”
和表_名称“AskLists”
和表_CATALOG='Lists'
表_SCHEMA='dbo'
;
声明@sql NVARCHAR(最大)=N'
具有
联合
作为
(
“++@union+”
)
挑选
AskLists.AskListId
,AskLists.AskInterview
,unioned.QUOTA7
从…起
歪斜者
内连接
联合
在unioned.source_表上=''AskList''+强制转换(AskLists.AskListID为VARCHAR(MAX))
和unioned.AskInterview=AskLists.AskInterview
'
EXEC sp_executesql@sql
演示:在加入表之前,可以使用动态SQL将所有表合并在一起
- 从根本上说,就是把它们放在一开始就应该具备的结构风格中
像这样的东西(它不仅仅是一个有点黑)
DECLARE@union-NVARCHAR(最大值)
挑选
@联合=
字符串_AGG(
强制转换(N'SELECT'.+TABLE_NAME+N''作为源_表,*来自'.+TABLE_CATALOG+N'.+TABLE_SCHEMA+N'.+TABLE_NAME作为NVARCHAR(MAX)),
CHAR(13)+CHAR(10)+N'UNION ALL'+CHAR(13)+CHAR(10)
)
从…起
信息\u SCHEMA.TABLES
哪里
表\u名称,如“AskList%”
和表_名称“AskLists”
和表_CATALOG='Lists'
表_SCHEMA='dbo'
;
声明@sql NVARCHAR(最大)=N'
具有
联合
作为
(
“++@union+”
)
挑选
AskLists.AskListId
,AskLists.AskInterview
,unioned.QUOTA7
从…起
歪斜者
内连接
联合
在unioned.source_表上=''AskList''+强制转换(AskLists.AskListID为VARCHAR(MAX))
和unioned.AskInterview=AskLists.AskInterview
'
EXEC sp_executesql@sql
演示:您使用的是哪种DBMS产品?“SQL”只是所有关系数据库使用的一种查询语言,而不是特定数据库产品的名称,动态SQL是高度特定于供应商的。请为您正在使用的数据库产品添加。这是一个糟糕且不可扩展的数据模型,但您确实需要动态sql。任何其他内容都需要您标记数据库平台。对不起,这是软件编辑器中的MS SQLNo表。我们创建的每个新项目都有一个递增的AskiList表。所以有上百个AskList表。我强烈建议您更改数据模型。首先,任何基本查询的编译时间都可能比执行时间长。很明显,这将是一个非常棘手的问题。可能创建一个表,您可以将所有内容转储到其中,并在每次插入时复制数据,可能使用触发器?您使用的是哪种DBMS产品?“SQL”只是所有关系数据库使用的一种查询语言,而不是特定数据库产品的名称,动态SQL是高度特定于供应商的。请为您正在使用的数据库产品添加。这是一个糟糕且不可扩展的数据模型,但您确实需要动态sql。任何其他内容都需要您标记数据库平台。对不起,这是软件编辑器中的MS SQLNo表。我们创建的每个新项目都有一个递增的AskiList表。所以有上百个AskList表。我强烈建议您更改数据模型。首先,任何基本查询的编译时间都可能比执行时间长。很明显,这将是一个非常棘手的问题。也许创建一个表,您可以将所有内容转储到其中,并在每次插入时复制数据,也许使用触发器?谢谢您,斯图,但是aq.quota7必须用变量号命名。在我的示例AskList5076.quota7中,谢谢你,斯图,但是aq.quota7必须用变量号命名。在我的例子AskList5076.quota7中,谢谢MatBailie。我得到了这个错误:STRING_AGG聚合结果超过了8000字节的限制。使用LOB类型以避免结果truncation@clement-将
字符串
的第一个输入转换为NVARCHAR(MAX)
(应答和小提琴更新)谢谢MatBailie。我得到了这个错误:STRING_AGG聚合结果超过了8000字节的限制。使用LOB类型以避免结果truncation@clement-将字符串的第一个输入\u AGG()
转换为NVARCHAR(MAX)
(应答和小提琴更新)