אני עובד על 2000
אני מנסה להעביר שם של טבלה אך מקבל שגיאות.
כנראה שאני עושה זאת באופן שאינו תקין.
בגדול הפונקציה צריכה לדמות את פונקציית rank באקסל (אני יודע שב 2005 היא כבר קיימת) כלומר לזהות את המיקום/דירוג של רשומה בטבלה עפ"י שדה כלשהו.
הפונקציה שכתבתי נראית כך:
create function F_Rank
(
@colToRank as float, --השדה שלפיו ייקבע הדירוג/המיקום
@rank as smallint, --שדה שיקבל את המיקום כשהערך ההתחלתי שלו הוא null
@table as nvarchar(100) --שם הטבלה
) As
Begin
declare @start as int,@end as int
set @start=1
set @end=(SELECT count(*) from @table)
while @start<=@end
begin
update @table
set @rank=@start
from (select Max(@colToRank)[colToRank]from @table where @rank is null)V
where @table.@colToRank=V.colToRank
set @start=@start+1
end
End
הנהלת האתר ביטלה גישת כתיבה ציבורית.
בעניין: שליחת טבלה לפונקציה
11 years 10 months ago #3855
פתרתי את הנושא באמצעות פרוצדורה שמקבלת 3 פרמטרים-
שם טבלה לעדכון , שם השדה שיש לדרג בטבלה , ושם השדה שבו יופיע הדירוג מ - 1 ועד סך הרשומות בטבלה (עם ערכי null בתחילה)
לכל המעוניין-
---------------------------------------------------------------------------------------------------------------------------------------------------
--הכנות
CREATE TABLE [dbo].[T_RowCount] ( [rowCount] [int] NULL ) ON [PRIMARY]
TRUNCATE TABLE dbo.T_RowCount --הפרוצדורה תמלא
CREATE TABLE [dbo].[T_test] ( [PERSON_NAME] [nvarchar] (50) COLLATE Hebrew_BIN NULL , [GRADE] [float] NULL , [RANK] [int] NULL ) ON [PRIMARY]
TRUNCATE TABLE dbo.T_test
--מילוי טבלה לדוגומה
--T_test
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'JOE',87,NULL)
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'EYAL',99,NULL)
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'JHON',78,NULL)
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'ELAD',86.5,NULL)
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'YOSSI',100,NULL)
INSERT INTO dbo.T_test (PERSON_NAME,GRADE,[RANK]) VALUES ( 'MIKE',68,NULL)
---------------------------------------------------------------------------------------------------------------------------------------------------
--פרוצדורה לקבלת דירוג/מיקום
CREATE PROC sp_Rank
@tbl AS NVARCHAR (128), --שם הטבלה
@colName AS NVARCHAR(100), --עמודה שיש לדרג
@rank AS NVARCHAR(25) --דירוג
As
TRUNCATE TABLE dbo.T_RowCount
BEGIN
declare @sql AS VARCHAR(8000)
declare @start as int
declare @end as int
set @start=1 PRINT '@start=' + CAST(@start AS NVARCHAR(5))
SET @sql = 'insert into dbo.T_RowCount select count(*) FROM ' + @tbl
EXEC(@sql)
set @end = (SELECT [rowCount] FROM dbo.T_RowCount) PRINT '@end=' + CAST(@end AS NVARCHAR(5))
WHILE @start<=@end
BEGIN
SET @sql = 'update '+ @tbl + ' '
SET @sql = @sql + 'set ' + @rank + ' ' + '=' + CAST(@start AS NVARCHAR(5)) +' from '
SET @sql = @sql + '(' + 'select Max(' + @colName + ')' + ' as colToRank ' + ' from ' + @tbl +' where ' + @rank +' is null' +')' +'V '
SET @sql = @sql + 'where' + ' ' + @tbl +'.'+ @colName + '=' + 'V.colToRank'
EXECUTE (@sql)
SET @start=@start+1
END
END
GO
---------------------------------------------------------------------------------------------------------------------------------------------------
--הרצת הפרוצדורה
EXEC sp_Rank 'T_test','GRADE','RANK'
--הצגת תוצאה
SELECT * FROM dbo.T_test ORDER BY 3
---------------------------------------------------------------------------------------------------------------------------------------------------