2014-09-29 102 views
0

所以我一直在这个工作几天,也许我一直在看它太久了。使用动态SQL创建表格

我想要做的是创建一个程序,将基于我的SELECT查询创建另一个表的原因是主表是超过17行长,功率在希望这个信息被破坏关于三数字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'[email protected]+ 
' FROM [2014_EBook].dbo.HollanderInformation AS ID 
WHERE SUBSTRING(ID.Interchange, 1, 3) = '[email protected]; 
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'[email protected]+ 
' FROM [2014_EBook].dbo.HollanderInformation AS ID 
    WHERE SUBSTRING(ID.Interchange, 1, 3) = '[email protected] 
GO 

我没有收到错误,一切都正常运行,但是当我打电话的程序,输入变量表不发 - 我承认,我努力学习,其中很大一部分是通过网上资源与试错

三 - 一旦这是所有做的计划是通宵达旦

什么我失踪的使用表值参数输入我的变量,让SQL流失,什么是方法我可以有更清洁和安全的代码?

感谢

+1

为什么要为每个班级创建一张桌子?你知道有很多方法可以使大表更加高效,而不必将它们分解成数百个无法管理的小表,对吧?另外,为什么标记为MySQL和SQL Server? – 2014-09-30 00:00:13

+1

'表超过17行'什么?你的意思是行吗? 17行非常小。 – Brandon 2014-09-30 00:24:06

+1

问你的实际问题不是你的尝试解决方案。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Horaciux 2014-09-30 00:25:36

回答

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 + '%' 
); 
+0

这就是我一直在寻找的东西,我很抱歉,如果它听起来不清楚我想做什么。 – 2014-09-30 14:14:00

+0

上面提到的还有“当时的权力”,每个提到的都是正确的。这是库存主管有数据库列表的地方,他希望查看/使用这些信息,但我相信他不了解数据的原始使用方式 - 他只是想要它。 – 2014-09-30 14:26:54

+0

很高兴帮助!如果这解决了您的问题,您可以将答案标记为正确吗?谢谢! – Brandon 2014-09-30 14:43:00