Parametr wyboru daty a openquery

0

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

1

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ć :)

0

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)

1

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
0

Właśnie z Distributed Query nie chciałem korzystać i szukam alternatywy, dzięki za pomocne odpowiedzi!

1

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:

  1. sp_executesql przyjmuje parametry
  2. 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
  3. Jeżeli korzystasz z tabel tymczasowych to exec nie wykorzystuje cache'u

1 użytkowników online, w tym zalogowanych: 0, gości: 1