[英]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.