2014-09-29 101 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