编辑:我发现我的代码存在一个重大问题 - 我将@IDno设置为整数,这与@FirstScan或@SecondScan无法比较。将其设置为NVarchar使其正常工作!
愚蠢的实习生在这里学习SQL。我的大部分编程经验都是用Python编写的,所以这对我来说非常不同。基本上,我们有一个数据库,它有~30个不同的表,每行约11k行,每行约40列。应始终显示某些行(姓名,地址,电话号码),并且用户将选择另外两个:他们将选择一个识别号码(因为每个表具有ID#一次,它将显示每个表中的一行)和他们希望查看的专栏(例如员工,资产等)
这是我现在的代码,可能是完整功能的一半(并且肯定充斥着不良做法。)我已经将一些变量名称更改为更通用,所以我不会透露太多关于公司 - 无论如何都不应该相关。获取ID#的代码被破坏了,但除此之外,它在技术上取得了相关数据(包括来自@Column的所需列),比较ID #s只显示那些,然后将它们放在一个输出中。
DECLARE @Column VARCHAR(25)
,@FirstScan NVARCHAR(MAX)
,@SecondScan NVARCHAR(MAX)
,@IDno INT
SET @Column = '"5F(2)(f)"'
SET @IDno = 19616
SET @FirstScan = N'SELECT [Organization ID#] AS ID#,
Registered#,
[Legal Name],
'+@Column+',
[Latest Form Filing Date]
FROM dbo.[FORM_2015-09]
WHERE
[Organization ID#] = '+@IDno''
SET @SecondScan = N'SELECT [Organization ID#] AS ID#,
Registered#,
[Legal Name],
'+@Column+',
[Latest Form Filing Date]
FROM dbo.[FORM_2015-08]
WHERE
[Organization CRD#] = '+@IDno'
EXECUTE(@FirstScan+ ' UNION ALL ' + @SecondScan)
我确信有更好的方法可以做到这一点,但这个拼凑在一起的代码是我得到的最好的。如果有人有更好的方法来解决这个问题(而不是只是解析代码和它的坏处,)请提出一些建议。如果这意味着以更好的方式完成任务,我愿意抛弃所有这些并重写。感谢。
答案 0 :(得分:0)
如果这些表都具有相同的列,您应该首先帮忙并创建一个视图:
create view v_forms as
select * from [FORM_2015-09] union all
select * from [FORM_2015-08] union all
. . .;
然后,视图上的动态SQL之类的东西应该更容易编写。
注意:将数据拆分为具有相同列的多个不同表是不好的做法。 SQL在大型表上运行良好,没有理由保留大量类似的小表。