MoppanMedlem sedan okt. 200257 inlägg Hallå!
Måste man ha en where-sats på en update? Jag har gjort en temporär tabell som bara kommer att innehålla en rad. Tabellen har 12 kolumner, en för varje månad (Month1 till Month12). För varje månad gör jag en uträkning och vill sedan lägga in den summeringen (@Hours) i tabellen för den aktuella månaden.
(Se nedan). Jag har ingen nyckel på tabellen, hur gör jag?
SET @Month = 1
WHILE @Month < 13
BEGIN
BLA BLA BLA
END
SET @ExecString = ''
SET @ExecString = 'UPDATE #StatisticTable SET Month' + CAST(@Month AS varchar) + ' = ' + CAST(ISNULL(@Hours, 0) AS varchar)
EXECUTE (@ExecString)
SET @Month = @Month + 1
END
@ndersMedlem sedan juni 200032 969 inlägg
Måste man ha en where-sats på en update?
Nej. Ska du uppdatera alla poster i en tabell behöver du ingen where-sats. Är det något problem med den kod du har?
MoppanMedlem sedan okt. 200257 inlägg Något fel är det iaf.. :)
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '1'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '2'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '3'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '4'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '5'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '6'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '7'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '8'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '9'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '10'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '11'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near '12'.
MoppanMedlem sedan okt. 200257 inlägg Nej men jag får inte ut några sifrror när hämtar allt i den temporära tabellen.... Nada....
LarsGMedlem sedan dec. 200012 464 inlägg Visa den riktiga koden då och inte något BLA HA
MoppanMedlem sedan okt. 200257 inlägg CREATE PROCEDURE spTime_GetDeb
(
@Year int,
@PersonID int = 0
)
AS
SET NOCOUNT ON
DECLARE @Month Int
DECLARE @Hours Int
DECLARE @ExecString varchar(2000)
CREATE TABLE #StatisticTable
(
Month1 Int,
Month2 Int,
Month3 Int,
Month4 Int,
Month5 Int,
Month6 Int,
Month7 Int,
Month8 Int,
Month9 Int,
Month10 Int,
Month11 Int,
Month12 Int,
--[Sum] Int,
--[Percent] Int
)
SET @Month = 1
WHILE @Month < 13
BEGIN
IF @PersonID = 0
BEGIN
SELECT @Hours = Sum(WorkedTime)
FROM TimePerDayAndProject TP
INNER JOIN Project P ON TP.ProjectID = P.ProjectID
INNER JOIN ProjectTypes PT ON P.ProjectTypesID = PT.ProjectTypesID
WHERE PT.Subtract <> 1 and datepart(yyyy,TP.DateField) = @Year AND datepart (mm,TP.DateField) = @Month
END
ELSE
BEGIN
SELECT @Hours = Sum(WorkedTime)
FROM TimePerDayAndProject TP
INNER JOIN Project P ON TP.ProjectID = P.ProjectID
INNER JOIN ProjectTypes PT ON P.ProjectTypesID = PT.ProjectTypesID
WHERE PT.Subtract <> 1 and datepart(yyyy,TP.DateField) = @Year AND datepart (mm,TP.DateField) = @Month and TP.PersonID = @PersonID
END
SET @ExecString = ''
SET @ExecString = 'UPDATE #StatisticTable SET Month' + CAST(@Month AS varchar) + ' = ' + CAST(ISNULL(@Hours, 0) AS varchar)
EXECUTE (@ExecString)
SET @Month = @Month + 1
END
SELECT * FROM #StatisticTable
SET NOCOUNT OFF
GO
LarsGMedlem sedan dec. 200012 464 inlägg Varför behöver du en temptabell överhuvudtaget?
Du kan väl göra en select med group by month() så att du får 12 poster till applikationen. Om du sedan vill visa dom på en rad så är ju inte det något problem.
Tillbaka till problemet.
Nu gör du aldrig insert i temptabellen och då finns det inget att uppdatera.
Jag har sett att det kan vara problem med funktioner och dylikt i samband med strängkonkatenering.
CREATE PROCEDURE spTime_GetDeb
(
@Year int,
@PersonID int = 0
)
AS
SET NOCOUNT ON
DECLARE @Month Int
DECLARE @Hours varchar(10)
declare @monthName varchar(10)
DECLARE @ExecString varchar(2000)
CREATE TABLE #StatisticTable
(
Month1 Int,
Month2 Int,
Month3 Int,
Month4 Int,
Month5 Int,
Month6 Int,
Month7 Int,
Month8 Int,
Month9 Int,
Month10 Int,
Month11 Int,
Month12 Int,
--[Sum] Int,
--[Percent] Int
)
insert into #StatisticTable default values
SET @Month = 1
WHILE @Month < 13
BEGIN
IF @PersonID = 0
BEGIN
SELECT @Hours = cast(Sum(WorkedTime) as varchar(10))
FROM TimePerDayAndProject TP
INNER JOIN Project P ON TP.ProjectID = P.ProjectID
INNER JOIN ProjectTypes PT ON P.ProjectTypesID = PT.ProjectTypesID
WHERE PT.Subtract <> 1 and datepart(yyyy,TP.DateField) = @Year AND datepart (mm,TP.DateField) = @Month
END
ELSE
BEGIN
SELECT @Hours = cast(Sum(WorkedTime) as varchar(10))
FROM TimePerDayAndProject TP
INNER JOIN Project P ON TP.ProjectID = P.ProjectID
INNER JOIN ProjectTypes PT ON P.ProjectTypesID = PT.ProjectTypesID
WHERE PT.Subtract <> 1 and datepart(yyyy,TP.DateField) = @Year AND datepart (mm,TP.DateField) = @Month and TP.PersonID = @PersonID
END
set @hours = coalesce(@hours,'0')
set @monthname = 'Month' + cast(@month as varchar(2))
SET @ExecString = 'UPDATE #StatisticTable SET Month' + @monthName + ' = ' + @Hours
EXECUTE (@ExecString)
SET @Month = @Month + 1
END
SELECT * FROM #StatisticTable
SET NOCOUNT OFF
MoppanMedlem sedan okt. 200257 inlägg Tack Lars!!!
Det enda jag lade till var: insert into #StatisticTable default values, resten lämnade jag som tidgare. Fungerar fina fisken.
Måste ha ut resultatet på en rad, i applikationen används ett speciellt programmeringsspråk...... Inget som jag har kommit på som du säkert förstår.. :) Jag är IQ fiskmås på det här stället.