Hej, czy istnieje możliwość dodania w openquery parametru wyboru dat? np.: @DataOd date i @DataDo date?
Szukam sposobu na optymalne odpytanie danych z innego serwera a chcę uniknąć pisania składni z LinkedServer.
Dzięki
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 3 lata
- Postów:33

- Rejestracja:ponad 17 lat
- Ostatnio:około 7 godzin
- Postów:1595
Nie OpenQuery to
' query '
Is the query string executed in the linked server. The maximum length of the string is 8 KB.
jedyne co możesz zrobić to sklejać string'a ale musisz uważać na ewentualne sqlinjections.
Znalazłem jeszcze SO taki art:
https://stackoverflow.com/questions/3378496/including-parameters-in-openquery
ale nie wiem czy faktycznie te rozwiązania działają bo nie mam pod ręką mssql aby sprawdzić :)
- Rejestracja:ponad 7 lat
- Ostatnio:ponad 3 lata
- Postów:33
Już ogarnąłem dzięki :)
DECLARE @DateFrom date = '20201101'
, @DateTo date = '20201112'
DECLARE @sql varchar(max)
SET @sql = 'SELECT * FROM OPENQUERY([ServerName], ''SELECT * FROM [DatabaseName].[dbo].[Table] WHERE Column BETWEEN ''''' + CONVERT(VARCHAR(8), @DateFrom, 112) + ''''' AND ''''' + CONVERT(VARCHAR(8), @DateTo, 112) + ''''''')'
EXECUTE (@sql)

- Rejestracja:ponad 22 lata
- Ostatnio:około 11 godzin
- Postów:3866
Istnieje jeszcze Distributed Query:
SELECT * FROM [ServerName].[DatabaseName].[dbo].[Table] WHERE Column BETWEEN @datefrom and @dateto
To jednak trzeba by przetestować (obejrzeć plan wykonania), bo otymizator zdecyduje, gdzie te rekordy będą filtrowane
Aby uniknąć klejenia stringów użyj Sp_executesql
DECLARE @DateFrom date = '20201101'
, @DateTo date = '20201112'
EXEC Servername.master.dbo.sp_executesql
N'SELECT * FROM [ServerName].[DatabaseName].[dbo].[Table] WHERE Column BETWEEN @r_datefrom and @r_dateto',
N'@r_datefrom date, @r_dateto date',
@datefrom,
@dateto
- Rejestracja:ponad 22 lata
- Ostatnio:około 11 godzin
- Postów:3866
Jeszcze pytanko, czy jak w tym przypadku wyślemy komendę w ' ' to czy i tak nie skleimy daty do stringa?
To i tak jest klejenie, kwestia tego co sie wygodniej czyta, bardziej chodzilo mi żeby była opcja czytelniejszego napisania zapytania, czyli twoje:
SELECT * FROM [DatabaseName].[dbo].[Table] WHERE Column BETWEEN ''''' + CONVERT(VARCHAR(8), @DateFrom, 112) + ''''' AND ''''' + CONVERT(VARCHAR(8), @DateTo, 112) + ''''''')'
vs
SELECT * FROM [DatabaseName].[dbo].[Table] WHERE Column BETWEEN @R_DateFrom AND @r_DateTo)
Przykład nie jest reprezentatywny, bo i sam where
nie jest jakoś mocno rozbudowany, ale jakby tam było 10 kolumn to już by robiło różnicę, odpada też konwertowanie zmiennych do nvarchar
Kwestia wyboru. Pomijając względy estetyczne to exec vs sp_executesql:
- sp_executesql przyjmuje parametry
- sp_executesql może wykorzystywać plany zapytań w pamięci podręcznej. SQL jest tworzony tylko raz, po czym za każdym razem, gdy wywoływane jest to samo zapytanie za pomocą sp_executesql, SQL Server pobiera plan zapytania z pamięci podręcznej i ponownie go wykorzystuje
- Jeżeli korzystasz z tabel tymczasowych to
exec
nie wykorzystuje cache'u