簡體   English   中英

使用動態SQL創建表

[英]Create table with Dynamic 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'+@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徹夜難眠

缺少什么?我可以用哪些方式獲得更干凈,更安全的代碼?

謝謝

目前尚不清楚您要的是什么,但是我要進行一個有根據的猜測,即您有一個名為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 + '%'
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM