DinoMedlem sedan sep. 20011 914 inlägg Ok, har då en tempurär tabell och behöver hjälp med hur två Select på den skall utformas.
1. En Select som tar ut vart femte art_id.
2. En Select som väljer TOP 5 från och med ett speifikt art_id. Har då testat med.
SELECT TOP 5 * FROM @tbl WHERE art_id >= @index
Men det funkar inte riktigt. @tbl kan ju ha genomlidigt en hel del sortering som kan ge detta utseende.
art_id
----------
32
1
54
43
278
266
2
23
61
70
43
67
177
132
Och då blir problemet att om @index är 54 då tas endast "54, 278, 266, 61, 70" ut istället för "54, 43, 278, 266, 2". Finns det någon enkel väg runt detta?
LarsGMedlem sedan dec. 200012 464 inlägg Det ser ut som om du skulle behöva ha ett sekvensnummer i din tabellvariabel.
Om du lägger till en kolumn (seqno) med identity så kan du ställa
select top 5 *
from @tbl
where seqno >
(select seqno
from @tbl
where art_id > @index)
order by seqno
top utan order by betyder egentligen att du kan få vad som helst eftersom du inte kan förutsätta någon viss ordning i tabellen.
select *
from @tbl
where seqno % 5 = 0
DinoMedlem sedan sep. 20011 914 inlägg Har lite problem med att skapa en kolumn. Testade med två nedan varianter men får fel, så lite hjälp där oxå kanske.
DECLARE @tbl table
(
a_id int,
a_pName varchar(30),
a_company varchar(30),
a_seqno int IDENTITY(1,1)
)
SET IDENTITY_INSERT @tbl ON
INSERT INTO @tbl
SELECT
a_id,
a_pName,
a_company
FROM Customer
WHERE a_c_id = @c_id
SELECT
a_id,
a_pName,
a_company,
IDENTITY(int, 1,1) AS a_seqno
INTO @tbl
FROM Customer
WHERE a_c_id = @c_id
DinoMedlem sedan sep. 20011 914 inlägg På första får jag "Incorrect syntax near '@tbl'." Vilket motsvarar raden med SET IDENTITY_INSERT @tbl ON.
På andra får jag samma fel fast vid INTO @tbl.
LarsGMedlem sedan dec. 200012 464 inlägg Såvitt jag förstår så kan man inte sätta identity_insert för tabellvariabler.
Tycker inte att du behöver sätta det heller i detta fall
INSERT INTO @tbl (a_id,a_pName, a_company)
SELECT
a_id,
a_pName,
a_company
FROM Customer
WHERE a_c_id = @c_id
select into används för att skapa en ny tabell så det fungerar inte att använda en tabellvariabel där.
Det verkar finnas lite begränsningar för hur tabellvariabler kan användas och jag ser ingen direkt förklaring till varför dessa begränsningar finns.
DinoMedlem sedan sep. 20011 914 inlägg Om jag inte sätter det så får jag "An explicit value for the identity column in table '@tbl' can only be specified when a column list is used and IDENTITY_INSERT is ON." vilket ju motsäger sig själv.
Hur kommer jag runt detta?
LarsGMedlem sedan dec. 200012 464 inlägg Hmm, du kanske kan använda funktionen identity när du gör fyller din tabellvariabel
INSERT INTO @tbl
SELECT
a_id,
a_pName,
a_company,
identity(1,1)
FROM Customer
WHERE a_c_id = @c_id
Detta är inget som jag har använt själv så jag spånar lite.
DinoMedlem sedan sep. 20011 914 inlägg Nä, funktionen funkar inte eftersom jag inte kan använda INTO på @tbl.
LarsGMedlem sedan dec. 200012 464 inlägg Jaha, kan du ha en egen räknare då
declare @counter int
set @counter = 0
INSERT INTO @tbl
SELECT
a_id,
a_pName,
a_company,
@counter = @counter + 1
FROM Customer
WHERE a_c_id = @c_id
eller du kanske måste återgå till en temptabell?
DinoMedlem sedan sep. 20011 914 inlägg Får detta fel på räknaren. "A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations."
DinoMedlem sedan sep. 20011 914 inlägg Ok, har fått lite hjälp av en Aaron Bertrand. Detta löser det hela.
DECLARE @tbl table
(
a_id int,
a_pName varchar(30),
a_company varchar(30),
a_seqno int IDENTITY(1,1)
)
INSERT INTO @tbl(a_id, a_pName, a_company)
SELECT
a_id,
a_pName,
a_company
FROM Customer
WHERE a_c_id = @c_id
Nu kan jag gå tillbaka till de lösningar du skrev i ditt första inlägg. Tack för hjälpen LarsG. :)
LarsGMedlem sedan dec. 200012 464 inlägg Det var ju samma som jag föreslog tidigare (13:29) tycker jag.
Vad är skillnaden?
DinoMedlem sedan sep. 20011 914 inlägg Skillnaden är att jag troligen drappats av total ordblindhet runt 13:29 snåret och uppfattade inte "(a_id,a_pName, a_company)" i ditt inlägg. *Slår mig själv i huvudet med en ca 40 cm hög lampa *
:r