Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态SQL能做到吗?_Sql_Sql Server_Dynamic Sql - Fatal编程技术网

动态SQL能做到吗?

动态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

我有一个名为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   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)
(应答和小提琴更新)