【问题标题】:Dynamic SQL Query using INNER JOIN使用 INNER JOIN 的动态 SQL 查询
【发布时间】:2021-10-10 15:21:42
【问题描述】:

这是根据线程中的建议更新的查询:

DECLARE
    @table      sysname,
    @sql        nvarchar(max),
    @dbname     sysname;

SELECT @dbname = MAX(dbname) 
FROM ACVSCore.dbo.ACVSUJournalVolumeManagement.dbname
WHERE ACVSCore.dbo.ACVSUJournalVolumeManagement LIKE '%ACVSUJournal%';

SELECT @table = N'.dbo.ACVSUJournalLog';

SET @sql = N'SELECT 
    ap.LastName as [Last Name],
    ap.FirstName as [First Name],
    ap.Text1 as [Company],
    ap.Text2 as [Employee ID],
    tn.ObjectName2 as [Door Name],
    MIN(tn.ServerUTC) AS [ServerUTC]
FROM ' + @dbname + @table + N' tn 
INNER JOIN 
    ACVSCore.Access.Personnel ap on tn.objectidentity1 = 
    ap.GUID
WHERE
    ap.PersonnelTypeID = ''2'' and tn.MessageType
    = ''CardAdmitted'' and tn.ServerUTC >= DATEADD(day, -1, GETDATE())
GROUP BY
    ap.Text1, ap.LastName, ap.FirstName, ap.Text2, tn.ObjectName2
ORDER BY 
    ap.Text1'
EXECUTE
    sp_executesql @sql;

我编辑了查询以反映建议的更改,现在它可以正常工作了。再次感谢!

【问题讨论】:

  • 不要对别名使用字符串文字,这个问题实际上消失了;无论如何,在我看来这是一个坏习惯,因为它会让一些人感到困惑。
  • 还有3+ part naming on Columns will be Deprecated;给您的对象起别名并以此方式限定您的列。
  • @SteveC 注意,标准方式是"
  • ACVSCore.dbo.ACVSUJournalVolumeManagement.dbname后面为什么有个逗号?
  • 好像有很多错别字

标签: sql sql-server tsql inner-join dynamic-sql


【解决方案1】:

这是我 [编辑:最新] 尝试修复错别字

DECLARE
  @table      sysname,
  @sql        nvarchar(max),
  @dbname     sysname;

select @dbname = MAX(dbname) 
from ACVSCore.dbo.ACVSUJournalVolumeManagement 
where ACVSCore.dbo.ACVSUJournalVolumeManagement LIKE '%ACVSUJournalLog%';

select @table = N'.dbo.ACVSUJournalLog';

SET @sql = N'SELECT 
    ap.LastName as [Last Name],
    ap.FirstName as [First Name],
    ap.Text1 as [Company],
    ap.Text2 as [Employee ID],
    tn.ObjectName2 as [Door Name],
    MIN(tn.ServerUTC) AS [ServerUTC]
FROM ' + @dbname + @table + N' tn 
INNER JOIN 
    ACVSCore.Access.Personnel ap on tn.objectidentity1 = 
    ap.GUID
WHERE
    ap.PersonnelTypeID = ''2'' and tn.MessageType
     = ''CardAdmitted'' and tn.ServerUTC >= DATEADD(day, -1, GETDATE())
GROUP BY
    ap.Text1, ap.LastName, ap.FirstName, ap.Text2, tn.ObjectName2
ORDER BY 
    ap.Text1'
EXECUTE
    sp_executesql @sql;

【讨论】:

  • 我更新了原始帖子并包含了执行查询时发生的情况的图像 --> 我必须删除 concat,因为它针对数据库名称运行了两次查询示例:ACVSUdatabaseACVSUDatabase.ACVSUJournalLog
  • 数据库名称需要QUOTENAME
【解决方案2】:

不要在别名中使用'

SET @sql = N'SELECT 
    ACVSCore.Access.Personnel.LastName as [Last Name],
    ACVSCore.Access.Personnel.FirstName as [First Name],
    ACVSCore.Access.Personnel.Text1 as [Company],
    ACVSCore.Access.Personnel.Text2 as [Employee ID],
    dbo.ACVSUJournalLog.ObjectName2 as [Door Name],
    MIN(dbo.ACVSUJournalLog.ServerUTC) AS [ServerUTC]
FROM ' + @dbname + @table

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多