日期和表名作为动态SQL中的参数
我正在尝试创建一个存储过程,它允许我选择一个开始日期和结束日期来获取数据,并有一个变量表名来写入数据 我想将这两个日期和表名作为参数传入存储过程。这就是我一直坚持的那部分。我取出存储过程来尝试让它工作。这样我可以看到错误所在的行日期和表名作为动态SQL中的参数,sql,sql-server,variables,stored-procedures,dynamic,Sql,Sql Server,Variables,Stored Procedures,Dynamic,我正在尝试创建一个存储过程,它允许我选择一个开始日期和结束日期来获取数据,并有一个变量表名来写入数据 我想将这两个日期和表名作为参数传入存储过程。这就是我一直坚持的那部分。我取出存储过程来尝试让它工作。这样我可以看到错误所在的行 DECLARE @MinDateWeek DATETIME SELECT @MinDateWeek= DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()), -7) DECLARE @MaxDateWeek DATETIME SELECT @
DECLARE @MinDateWeek DATETIME
SELECT @MinDateWeek= DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()), -7)
DECLARE @MaxDateWeek DATETIME
SELECT @MaxDateWeek= DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),0)
DECLARE @SQLCommand NVARCHAR(MAX)
SET @SQLCommand = ' --ERROR ON THIS LINE
-- Getting how much space is used in the present
DECLARE @Present Table (VMName NVARCHAR(50), UseSpace float(24))
INSERT INTO @Present
SELECT VMName
,SUM(CapacityGB-FreeSpaceGB)
FROM VMWareVMGuestDisk
GROUP BY VMName;
-- Getting how much space was used at the reference date
DECLARE @Past Table (VMName NVARCHAR(50), UseSpace float(24))
INSERT INTO @Past
SELECT VMName
,SUM(CapacityGB-FreeSpaceGB)
FROM VMWareVMGuestDisk
WHERE Cast([Date] AS VARCHAR(20))= '''+CAST(@MinDateWeek AS varchar(20))+'''
GROUP BY VMName;
--Inserting the average growth(GB/DAY) between the 2 dates in a Temporary Table
CREATE TABLE #TempWeek (VMName NVARCHAR(50)
, CapacityGB float(24)
, GrowthLastMonthGB float(24)
, FreeSpace FLOAT(24) )
INSERT INTO #TempWeek
SELECT DISTINCT V.VMName
,SUM(V.CapacityGB)
,SUM(((W1.UseSpace-W2.UseSpace)/(DATEDIFF(DAY,'''+CONVERT(VARCHAR(50),@MaxDateWeek)+''','''+CONVERT(VARCHAR (50),@MaxDateWeek)+'''))))
,SUM(V.FreeSpaceGb)
FROM VMWareVMGuestDisk AS V
LEFT JOIN
@Present AS W1
ON
V.VMName=W1.VMName
LEFT JOIN
@Past AS W2
ON
W1.VMName=W2.VMName
WHERE (CONVERT(VARCHAR(15),Date))='''+CONVERT(VARCHAR(50),@MaxDateWeek)+'''
GROUP BY V.VMName;
-- Checking if there is already data in the table
TRUNCATE TABLE SAN_Growth_Weekly;
--insert data in permanent table
INSERT INTO SAN_Growth_Weekly (VMName,Datacenter,Cluster,Company,DaysLeft,Growth, Capacity,FreeSpace,ReportDate)
SELECT DISTINCT
G.VMName
,V.Datacenter
,V.Cluster
,S.Company
, DaysLeft =
CASE
WHEN G.GrowthLastMonthGB IS NULL
THEN ''NO DATA''
WHEN (G.GrowthLastMonthGB)<=0
THEN ''UNKNOWN''
WHEN (G.FreeSpace/G.GrowthLastMonthGB)>0 AND (G.FreeSpace/G.GrowthLastMonthGB) <=30
THEN ''Less then 30 Days''
WHEN (G.FreeSpace/G.GrowthLastMonthGB)>30 AND (G.FreeSpace/G.GrowthLastMonthGB)<=60 THEN ''Less then 60 Days''
WHEN (G.FreeSpace/G.GrowthLastMonthGB)>60 AND (G.FreeSpace/G.GrowthLastMonthGB)<=90
THEN ''Less then 90 Days''
WHEN (G.FreeSpace/G.GrowthLastMonthGB)>90 AND (G.FreeSpace/G.GrowthLastMonthGB)<=180 THEN ''Less then 180 Days''
WHEN (G.FreeSpace/G.GrowthLastMonthGB)>180 AND (G.FreeSpace/G.GrowthLastMonthGB)<=365 THEN ''Less then 1 Year''
ELSE ''Over 1 Year''
END
,G.GrowthLastMonthGB
,G.CapacityGB
,G.FreeSpace
,'''+@MaxDateWeek+'''
FROM #tempWeek AS G
RIGHT JOIN VMWareVMGuestDisk AS V
ON V.VMName = G.VMName COLLATE SQL_Latin1_General_CP1_CI_AS
LEFT JOIN Server_Reference AS S
ON G.VMName COLLATE SQL_Latin1_General_CP1_CI_AS=S.[Asset Name]
WHERE '''+CONVERT(VARCHAR(50),@MaxDateWeek)+'''= CONVERT(VARCHAR(50),V.Date);'
EXEC sp_executesql @SQLCommand;
我得到的错误是
从字符转换日期和/或时间时转换失败
绳子
谢谢您的帮助。您是否忘记将组包含在动态sql中
ALTER PROCEDURE SAN_DISK_GROWTH
@MaxDateWeek DATETIME ,
@MinDateWeek DATETIME
AS
BEGIN
DECLARE @SQLCommand NVARCHAR(MAX)
SELECT @SQLCommand = '
DECLARE @Present Table (VMName NVARCHAR(50), UseSpace float(24))
INSERT INTO @Present
SELECT VMName
,SUM(CapacityGB - FreeSpaceGB)
FROM VMWareVMGuestDisk
WHERE CONVERT(VARCHAR(15),Date) = '''
+ CONVERT(VARCHAR(50), @MaxDateWeek) + ''' GROUP BY VMName;'
END
尝试将日期/时间值指定为动态SQL查询的参数。换句话说,不要将日期转换为varchar,而是在查询中使用参数:
WHERE @MaxDateWeek = V.Date;
并将调用中的参数传递给sp_executesql,如下所示:
EXEC sp_executesql @SQLCommand,
'@MindateWeek datetime, @MaxDateWeek datetime',
@MinDateWeek = @MinDateWeek,
@MaxDateWeek = @MaxDateWeek
这样,您就不必将日期转换为字符串
请注意,这不适用于动态表名或列名。这些需要作为动态SQL本身的一部分连接在一起
例如,如果您有如下表名变量:
declare @TableName sysname
set @TableName = 'MyTable'
set @SQLCommand = N'SELECT ...
FROM ' + @TableName + N' WHERE...
如果希望动态SQL从该表中检索数据,则需要像下面这样构建from语句:
declare @TableName sysname
set @TableName = 'MyTable'
set @SQLCommand = N'SELECT ...
FROM ' + @TableName + N' WHERE...
这会将名称构建到SQL中,如下所示:
'SELECT ... FROM MyTable WHERE...'
是的。这只是我代码的一部分。它长了很多,但是当我从字符串转换日期和/或时间时,我的转换失败了。我不明白那个错误。这是在运行它时还是在编译时?你在传递什么论点?是在我运行它的时候。我要错过两次约会。声明@Start-DATETIME选择@Start=DATEADDWEEK,DATEDIFFWEEK,0,GETDATE,-7声明@End-DATETIME选择@End=DATEADDWEEK,DATEDIFFWEEK,0,GETDATE,0执行SAN_Disk\u Growth@Start,@End这是我作为变量传递的内容。没关系,我自己也很新。此字段中的日期是什么?:CONVERTVARCHAR15,Date如果是字段名,可能需要括号[Date]。是的,这是一个Datetime字段,我尝试了括号,但没有成功。我以前尝试过,但没有成功。我刚刚意识到我没有指定这个,但是我想要作为变量的表名在我的insert语句中。