Seneste forumindlæg
Køb / Salg
 * Uofficiel Black/White liste V3
Login / opret bruger

Forum \ Programmering og webdesign \ Programmering
Denne tråd er over 6 måneder gammel

Er du sikker på, at du har noget relevant at tilføje?

Linked server i Dynamisk SQL

Af Mega Supporter jhc9817 | 07-09-2021 21:05 | 3087 visninger | 9 svar, hop til seneste
Hey Har lidt problemer med at få dynamsik SQL til at fungere med en linked server. Der hvor jeg har markeret med fed vil jeg gerne bruge en variable for servernavnet. Men kan squ ikke få det til fungere. Er der nogen som har forstand på det ? :) Og ja koden er ikke pæn - den skal rettes til, men mit issue er at jeg ikke kan få "lortet" til at fungere med server variable. -- Set server properties DECLARE @SERVER_NAME VARCHAR(100) CREATE TABLE ##Databases( ServerName varchar(100), DatabaseName varchar(100) ) CREATE TABLE ##TableGrants( name varchar(100), type_desc varchar(100), permission_name varchar(100), state_desc varchar(100), class_desc varchar(100), objectName varchar(100), DatabaseName varchar(100), ServerName varchar(100) ) CREATE TABLE ##Servers( Name varchar(100) ) DECLARE SERVER_CURSOR CURSOR FOR SELECT s.data_source FROM sys.servers s WHERE s.is_linked = 1 OPEN SERVER_CURSOR FETCH NEXT FROM SERVER_CURSOR INTO @SERVER_NAME BEGIN exec sp_serveroption @server=@SERVER_NAME, @optname='rpc', @optvalue='true' exec sp_serveroption @server=@SERVER_NAME, @optname='rpc out', @optvalue='true' END DEALLOCATE SERVER_CURSOR -- Get data DECLARE @DBName varchar(100) DECLARE Server_CURSOR CURSOR FOR SELECT s.data_source FROM sys.servers s WHERE s.is_linked = 1 OPEN SERVER_CURSOR FETCH NEXT FROM SERVER_CURSOR INTO @SERVER_NAME WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('INSERT INTO ##Databases(DatabaseName) SELECT name from ['+@Server_name+'].master.sys.databases') UPDATE ##Databases SET ServerName =@SERVER_NAME WHERE ServerName IS NULL FETCH NEXT FROM SERVER_CURSOR INTO @SERVER_NAME END DEALLOCATE SERVER_CURSOR DECLARE @Database_Name varchar(100) DECLARE Database_CURSOR CURSOR FOR SELECT DatabaseName from ##Databases OPEN Database_CURSOR FETCH NEXT FROM Database_CURSOR INTO @Database_Name While @@FETCH_STATUS = 0 BEGIN INSERT INTO ##TableGrants(name,type_desc, permission_name,state_desc, class_desc , objectName) EXEC('USE ' + @Database_Name + ' ' + 'select princ.name, ' + 'princ.type_desc, '+ 'perm.permission_name, '+ 'perm.state_desc, '+ 'perm.class_desc, ' + 'object_name(perm.major_id) ' + ' from sys.database_principals princ '+ ' left join ' + ' sys.database_permissions perm ' + 'on perm.grantee_principal_id = princ.principal_id ') AT [DESKTOP-N76O6I4\TAKSATORSQL] UPDATE ##TableGrants SET DatabaseName = @Database_Name, ServerName = @SERVER_NAME WHERE DatabaseName IS NULL AND ServerName IS NULL FETCH NEXT FROM Database_CURSOR INTO @Database_Name END DEALLOCATE Database_CURSOR SELECT * from ##TableGrants order by name, objectName DROP TABLE ##Databases DROP TABLE ##Servers DROP TABLE ##TableGrants
--
Sidst redigeret 07-09-2021 21:06
#1
Karl Einar
Gæst
07-09-2021 21:08

Rapporter til Admin
Pls upload på pastebin
--
Gæstebruger, opret dit eget login og få din egen signatur.
#2
jhc9817
Mega Supporter
07-09-2021 21:12

Rapporter til Admin
#3
SShadowS
Guru
07-09-2021 22:32

Rapporter til Admin
Kør lige: Exec master.dbo.sp_server_info Er attribute 16 IDENTIFIER_CASE = SENSITIVE?
--
5950X|Crosshair VIII Formula|64GB RAM Gainward3090-GS|PG279Q Samsung970 EVO+ 1TB+2TB|Samsung 860 PRO 2TB 2xSamsung860 QVO 2TB|Corsair AX1600i
#4
SShadowS
Guru
08-09-2021 09:07

Rapporter til Admin
Hvis den siger SENSITIVE, så er din master case sensitive og dermed også dine variabler. Lidt en spøjs ting, but thats life. https://ntsblog.homedev.com.au[...]
--
5950X|Crosshair VIII Formula|64GB RAM Gainward3090-GS|PG279Q Samsung970 EVO+ 1TB+2TB|Samsung 860 PRO 2TB 2xSamsung860 QVO 2TB|Corsair AX1600i
#5
jhc9817
Mega Supporter
08-09-2021 09:58

Rapporter til Admin
Hej Torben Det har mere at gøre med at man ikke kan bruge kommandoen AT i forbindelse med den dynamiske SQL. Den her vil jeg gerne have skiftet ud : [DESKTOP-N76O6I4\TAKSATORSQL] Med [@Server_Name] og det er der den hopper af for mig.
--
#6
SShadowS
Guru
08-09-2021 10:14

Rapporter til Admin
#5 Referer man ikke til Linked server således? select * from LinkedServerName.DatabaseName.OwnerName.TableName eller fra to tables på hver deres server: select * from LocalTable, [OtherServerName].[OtherDB].[dbo].[OtherTable]
--
5950X|Crosshair VIII Formula|64GB RAM Gainward3090-GS|PG279Q Samsung970 EVO+ 1TB+2TB|Samsung 860 PRO 2TB 2xSamsung860 QVO 2TB|Corsair AX1600i
--
Sidst redigeret 08-09-2021 10:16
#7
Thomas G
Elitebruger
08-09-2021 12:58

Rapporter til Admin
Jeg er ikke sikker på at exec er understøttet via linkedserver. SShardowS har for så vidt ret, og kan bruges til inspiration til en mulig løsning. Lav et view på den relevante database på linkedserver SELECT * FROM linkedserverher.mindatabase.dbo.mitsmarteview Så tror jeg du har bygge sten til at komme imål. Alternativt skal du opgive exec og bare lave det direkte ala insert into lokaltabel SELECT princ.name, princ.type_desc, perm.permission_name, perm.state_desc, perm.class_desc, object_name(perm.major_id) from linkedservername.databasename.sys.database_principals princ left join linkedservername.databasename.sys.database_permissions perm on perm.grantee_principal_id = princ.principal_id Der skal nok justeres lidt har ikke lige adgang til linkedserver setup lige nu.
--
#8
SShadowS
Guru
08-09-2021 13:08

Rapporter til Admin
#7 Ja, det burde løse det. Altså hvis det er fordi han ikke vil pille ved de SQL'er der koblers op imod så kan jeg godt se brugen af EXEC, men ellers brug Views til det. Men hvis man først bruger linked server så er et view nok heller ikke det værste at oprette.
--
5950X|Crosshair VIII Formula|64GB RAM Gainward3090-GS|PG279Q Samsung970 EVO+ 1TB+2TB|Samsung 860 PRO 2TB 2xSamsung860 QVO 2TB|Corsair AX1600i
#9
jhc9817
Mega Supporter
09-09-2021 17:04

Rapporter til Admin
Problemet er at jeg ikke har navnet på den linked server når jeg skriver SQL'en og navnet på den linked server skal dermed indlæses i en variable. Måden som I skriver SQL'en kræver at man kender navnet på den linked server på programmerings tidspunket. Har overhovedet ingen problemer med at bruge en linked server når jeg kender navnet på den - problemet er at jeg ikke kender den. Navnet på den linked server tager jeg ved at lave en SELECT som SELECT * FROM sys.Servers s where s.IS_Linked = 1 Der tager jeg en cursor og løber datasættet igennem.
--

Opret svar til indlægget: Linked server i Dynamisk SQL

Grundet øget spam aktivitet fra gæstebrugere, er det desværre ikke længere muligt, at oprette svar som gæst.

Hvis du ønsker at deltage i debatten, skal du oprette en brugerprofil.

Opret bruger | Login
NYHEDSBREV
Afstemning


ANNONCE