Svaret afhænger af dine krav til resultatet. Har du brug for et resultat med et ensartet sæt kolonner, uanset brugernes privs? Hvis det er tilfældet, kan du indstille de ikke-tilladte værdier til null (eller en anden speciel værdi) ved hjælp af en IF-klausul, f.eks.
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1,
IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d,
UserPrivileges p
WHERE p.userId = '#'
AND d.DataId = '#'
Selvfølgelig kan den "særlige værdi" være et problem, da du har brug for en værdi, der aldrig ville blive vist i dataene. Hvis du havde brug for at kende forskellen mellem en null, fordi den reelle værdi er null vs. null, fordi det er en forbudt kolonne, så kan du ikke bruge null.
En anden tilgang ville have dig til at inkludere privilegieindikatoren for hver kolonne, der vises i resultatet, og lade din forretningslogik bruge det til at bestemme, hvilke værdier der er synlige for brugeren.
En meget anden tilgang ville have resultatet sat til kun at indeholde de tilladte kolonner. I dette tilfælde skal du bygge din sql-sætning dynamisk. Jeg ved ikke, om du gør dette i en lagret procedure eller på et værtssprog, men den grundlæggende idé er noget som denne:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"execute" betyder hvad end du har til rådighed for at udføre en streng som en sql-kommando.
mere efter afklaring fra OP:
Ok, du har brug for sql-funktion, der returnerer en streng, der ligner "colname1, colname2, ...". Det følgende ligner, hvordan det ville se ud i sql-serveren. syntaks
create function
FIELDS_NAME_QUERY (@userid int)
begin
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId
declare @result varhcar(60)
set @result = ''
if (@col1priv = 1) @result = 'col1'
if (@col2priv = 1) @result = @result + ' ,col2'
if (@col3priv = 1) @result = @result + ' ,col3'
return @result
end