使用动态SQL创建表

时间:2014-09-29 23:58:22

标签: sql

所以我已经在这几天工作了,也许我已经看了太久了。

我要做的是创建一个程序,根据我的SELECT查询创建另一个表,原因是主表超过17行,并且功率需要将此信息打破三位数ID。这个ID号是顺序的,但我确实有一张表,列出了所有这些ID。

我的问题有三个(至少我希望如此)部分。

创建动态SQL字符串以生成表格并提取正确的信息(DONE)

DECLARE @SQL NVARCHAR(MAX),  
@Class NVARCHAR(3)  
SET  @Class ='103'  
SET @SQL = 'SELECT ID.PartIntchNbr, ID.MfrCd, ID.OemId, ID.Application, ID.Interchange ,ID.HollanderPrice INTO     Hldr.Hollander'+@Class+  
' FROM [2014_EBook].dbo.HollanderInformation AS ID   
WHERE SUBSTRING(ID.Interchange, 1, 3) = '+@Class;  
EXEC (@SQL) 

但是我觉得可能会有更安全/更清洁的方法。

当我尝试从此创建一个过程时遇到问题所以我可以为@Class传入一个变量。

CREATE PROCEDURE Hldr.HldrBreakDown  
@Class NVARCHAR(3)  
AS  

DECLARE   
@SQL NVARCHAR(MAX)  
SET @SQL =   
'SELECT ID.PartIntchNbr, ID.MfrCd, ID.OemId, ID.Application, ID.Interchange ,ID.HollanderPrice INTO        Hldr.Hollander'+@Class+  
 ' FROM [2014_EBook].dbo.HollanderInformation AS ID  
  WHERE SUBSTRING(ID.Interchange, 1, 3) = '+@Class  
GO  

我没有收到错误,一切运行正常,但是当我调用程序并输入变量时没有制作表格 - 我会承认我正在努力学习,其中大部分都是通过试验和错误的在线资源

第三 - 一旦完成这一切,计划是使用表值参数输入我的变量并让SQL彻夜翻转

缺少什么,我有什么方法可以获得更清晰,更安全的代码?

谢谢

1 个答案:

答案 0 :(得分:0)

目前还不清楚你要求的是什么,但我会采取一种有根据的猜测,你有一个名为HollanderInformation的表,其中包含数百万行,而其他人则希望根据第一行查询该表Interchange列的3位数字。还有一个猜测:查询这些数据需要很长时间。

正如评论中所提到的那样,权力可能会告诉你他们遇到的问题,并由你来解决或指示解决方案。如果上述解决方案是他们所要求的,那么请阅读此解决方案并将其转回给他们。如果没有,那么阅读并执行它。

SELECT
  ID.PartIntchNbr,
  ID.MfrCd,
  ID.OemId,
  ID.Application,
  ID.Interchange,
  ID.HollanderPrice
FROM [2014_EBook].dbo.HollanderInformation AS ID  
WHERE ID.Interchange LIKE @Class + '%'

然后在Interchange上添加一个索引,看看是否加快了它的速度。

create nonclustered index on ix_HollanderInformation_Interchange [2014_EBook].dbo.HollanderInformation (Interchange);

如果这对您有用,那么您可以轻松地创建一个带有@Class参数的表值函数。这来自SQL Server technet文档,并根据您的需要进行了调整。

IF OBJECT_ID(N'dbo.HldrBreakDown', N'IF') IS NOT NULL
    DROP FUNCTION dbo.HldrBreakDown;
GO

CREATE FUNCTION dbo.HldrBreakDown(@Class nvarchar(50))  -- whatever type is appropriate here
RETURNS table
AS
RETURN (
  SELECT
    ID.PartIntchNbr,
    ID.MfrCd,
    ID.OemId,
    ID.Application,
    ID.Interchange,
    ID.HollanderPrice
  FROM dbo.HollanderInformation AS ID  
  WHERE ID.Interchange LIKE @Class + '%'
);