Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
на MSSQL2000 пишу такой запрос:
SELECT ODate FROM
	OPENROWSET('SQLOLEDB.1', 'DRIVER={SQL Server};SERVER=<Server>;Database=<BaseName>;UID=sa;PWD=<Password>', 
	   'SELECT distinct ODate
		  FROM Periods
		  where ODate <= ''20180201''
		  order by ODate
		  ') AS P

он отрабатывает нормально.

Затем пишу такой запрос:
declare
  @date1 datetime, @date2 datetime
  , @SrvName nvarchar(255)
  , @DBName nvarchar(255)
  , @Log nvarchar(255)
  , @Pass nvarchar(255)
  , @TmpAuth nvarchar(250)
  , @TmpSQL nvarchar(4000)

set @SrvName = N'<Server>'
set @DBName = N'<BaseName>'
set @Log = N'sa'
set @Pass = N'<Password>'
set @date1 = N'20180201'
set @date2 = N'20180202'

if @Log is NULL
   set @TmpAuth = 'Trusted_Connection=yes;Integrated Security=SSPI;Persist Security Info=False;'
   else set @TmpAuth = 'UID=' + @Log + ';PWD=' + @Pass

EXEC sp_executesql N'
    SELECT ODate FROM
		OPENROWSET(''SQLOLEDB.1'', ''DRIVER={SQL Server};SERVER=@SrvName;Database=@DBName;@TmpAuth'', 
		   ''SELECT distinct ODate
			  FROM Periods
			  where ODate <= @date2
			  order by ODate
			  '') AS P
	'
	, N'@SrvName nvarchar(255), @DBName nvarchar(255), @TmpAuth nvarchar(255), @date2 datetime'
	, @SrvName, @DBName, @TmpAuth, @date2

выдает ошибку:
автор
Server: Msg 7399, Level 16, State 1, Line 2
OLE DB provider 'SQLOLEDB.1' reported an error.
[OLE/DB provider returned message: Invalid connection string attribute]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB.1' IDBInitialize::Initialize returned 0x80004005: ].


не могу понять, почему?... Запросы-то одинаковые.
26 мар 18, 16:37    [21287009]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
нуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))
26 мар 18, 17:02    [21287134]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
Гигабайт Мегабайтович Килобайтов
нуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))

а вы как думаете, догадаюсь ли я, если еще не догадался? ))

млин, ну ясно же, что если бы догадался, то и не спрашивал бы.
Понимаю, что где-то или опечатался или тупанул. Но не вижу...
26 мар 18, 17:11    [21287168]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
нуб987,

Вы еж не параметры передаете, а строку формируете.

'SERVER='+@SrvName+';Database='+@DBName
26 мар 18, 17:13    [21287174]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
Владислав Колосов
нуб987,

Вы еж не параметры передаете, а строку формируете.

'SERVER='+@SrvName+';Database='+@DBName

если бы я так делал, я бы воспользовался простым exec
но для упрощения и убирания лишних кавычек (вдруг этот второй вариант я еще куда-то вложу) использую sp_executesql.

Или вы хотите сказать, что я в принципе сделал неверно и следовало написать так?:
declare @TmpSQL nvarchar(4000)
set @TmpSQL = N'
    SELECT ODate FROM
		OPENROWSET(''SQLOLEDB.1'', ''DRIVER={SQL Server};SERVER=' + @SrvName + ';Database=' + @DBName + ';' + @TmpAuth + ''', 
		   ''SELECT distinct ODate
			  FROM Periods
			  where ODate <= @date2
			  order by ODate
			  '') AS P
	'

EXEC sp_executesql @TmpSQL
	, N'@SrvName nvarchar(255), @DBName nvarchar(255), @TmpAuth nvarchar(255), @date2 datetime'
	, @SrvName, @DBName, @TmpAuth, @date2


но это ж какой-то изврат..... Тогда в чем преимущества sp_executesql с его параметрами?
26 мар 18, 17:19    [21287202]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Konst_One
Member

Откуда:
Сообщений: 11521
а с чего вы решили, что openrowset позволяет такие вольности?
26 мар 18, 17:20    [21287214]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
Konst_One
а с чего вы решили, что openrowset позволяет такие вольности?

такие - какие?
26 мар 18, 17:24    [21287238]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7769
нуб987,

sp_executesql редко использую, но, если правильно помню, эта процедура служит для передачи значений переменным или параметрам. Т.е. она не работает как макроподстановщик.
26 мар 18, 17:29    [21287265]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
нуб987
Konst_One
а с чего вы решили, что openrowset позволяет такие вольности?

такие - какие?

sp_executesql не подставляет значения, а объявлет ваши переменные и задаёт их значения, OPENROWSET не поддерживает переменные в строке подключения
26 мар 18, 17:31    [21287277]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
нуб987
Гигабайт Мегабайтович Килобайтов
нуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))

а вы как думаете, догадаюсь ли я, если еще не догадался? ))

млин, ну ясно же, что если бы догадался, то и не спрашивал бы.
Понимаю, что где-то или опечатался или тупанул. Но не вижу...


то что в OPENROWSET передаются только строковые константы, в них не может быть переменных. Это раз
так как вы написали - как раз и является строковой константой - это два ))
И так-же три - ваши переменные не приходят в sp_executesql, так как в тексте он не находит никаких переменных.
26 мар 18, 17:39    [21287299]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
TaPaK
нуб987
пропущено...

такие - какие?

sp_executesql не подставляет значения, а объявлет ваши переменные и задаёт их значения, OPENROWSET не поддерживает переменные в строке подключения

нет. В данном случае моя ошибка в двойных кавычках.

Вот другой пример:
declare
   @TmpSQL nvarchar(4000)

set @TmpSQL = 'print ''@qqq'''

exec sp_executesql @TmpSQL, N'@qqq varchar(100)', N'qwer'


выдаст не 'qwer', а '@qqq'

и когда я писал
EXEC sp_executesql N'
    SELECT ODate FROM
		OPENROWSET(''SQLOLEDB.1'', ''DRIVER={SQL Server};SERVER=@SrvName;...'

то там были вложенные кавычки. Т.е. в итоге целевой запрос к серверу выглядел не так:
SELECT ODate FROM
		OPENROWSET('SQLOLEDB.1', 'DRIVER={SQL Server};SERVER=<Server>; ...'

а так:
SELECT ODate FROM
		OPENROWSET('SQLOLEDB.1', 'DRIVER={SQL Server};SERVER=@SrvName; ...'


Итого:
писать все-таки придется как подсказал Владислав Колосов:
'SERVER='+@SrvName+';Database='+@DBName
26 мар 18, 17:41    [21287307]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
нуб987,

нунахрен....
26 мар 18, 17:45    [21287323]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Konst_One
Member

Откуда:
Сообщений: 11521
+100
ну...
26 мар 18, 17:46    [21287327]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
blonduser
Member

Откуда:
Сообщений: 132
нуб987,

Нужно параметры передать в sp_executesql вот так...
...
, N'@SrvName nvarchar(255), @DBName nvarchar(255), @TmpAuth nvarchar(255), @date2 datetime'
, @SrvName = @SrvName , @DBName = @DBName, @TmpAuth = @TmpAuth, @date2 = @date2

Слева переменная внутренняя, справа переменная внешняя.
26 мар 18, 17:49    [21287336]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
blonduser
нуб987,

Нужно параметры передать в sp_executesql вот так...
...
, N'@SrvName nvarchar(255), @DBName nvarchar(255), @TmpAuth nvarchar(255), @date2 datetime'
, @SrvName = @SrvName , @DBName = @DBName, @TmpAuth = @TmpAuth, @date2 = @date2

Слева переменная внутренняя, справа переменная внешняя.

а хелп вы когда-нибудь открывали?
26 мар 18, 17:51    [21287345]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
TaPaK
нуб987,

нунахрен....

это да...
а как по-человечески это сделать?
26 мар 18, 17:55    [21287360]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
blonduser
Member

Откуда:
Сообщений: 132
TaPaK,
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql
26 мар 18, 17:55    [21287362]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
blonduser
TaPaK,
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql


вот - вот и прочитайте прям там ссылка

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql

и подумайте
26 мар 18, 18:00    [21287400]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
TaPaK
blonduser
TaPaK,
https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql


вот - вот и прочитайте прям там ссылка

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql

и подумайте

про sp_executesql читал несколько раз
думал еще больше раз

не могли бы вы яснее написать, на что именно вы намекаете?

ПС. заметил, что на этом форуме общение происходит как-то.... не пафосно, а..... свысока что ли..... Ответы даются с этакой ленцой, как кость собаке кинули, мимо проходя. Или как замороженный полуфабрикат: типа есть захочет, сама расковыряет.

я очень уважаю ваши знания (тут я говорю не о конкретном человеке, а обо всех экспертах). Но доступный для понимания ответ приходится вытягивать клещами, тратя лишнее время всех собеседников.
И если на других форумах доступный ответ приходит если не вторым, так третьим сообщением. То здесь легко можно завязнуть на несколько страниц.

К сожалению, большинство экспертов присутствует именно на этом форуме...
Видимо, это как неискоренимый совок на почте или в какой-нибудь бухгалтерии, когда толстые тетеньки бальзаковского возраста цедят сквозь зубы "здрсьте". Вот и на этом форуме выработалась своя манера общения с полунамеками, типа захочешь - догадаешься
26 мар 18, 18:19    [21287466]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
нуб987,

автор
Нужно параметры передать в sp_executesql вот так...
...
, N'@SrvName nvarchar(255), @DBName nvarchar(255), @TmpAuth nvarchar(255), @date2 datetime'
, @SrvName = @SrvName , @DBName = @DBName, @TmpAuth = @TmpAuth, @date2 = @date2

коротко - не нужно зпт не ошибка как делает ТС зпт ошибка не из-за этого зпт подробности письмом(msdn) тчк
27 мар 18, 09:10    [21288548]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
нуб987
TaPaK
пропущено...


вот - вот и прочитайте прям там ссылка

https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql

и подумайте

про sp_executesql читал несколько раз
думал еще больше раз

не могли бы вы яснее написать, на что именно вы намекаете?

ПС. заметил, что на этом форуме общение происходит как-то.... не пафосно, а..... свысока что ли..... Ответы даются с этакой ленцой, как кость собаке кинули, мимо проходя. Или как замороженный полуфабрикат: типа есть захочет, сама расковыряет.

я очень уважаю ваши знания (тут я говорю не о конкретном человеке, а обо всех экспертах). Но доступный для понимания ответ приходится вытягивать клещами, тратя лишнее время всех собеседников.
И если на других форумах доступный ответ приходит если не вторым, так третьим сообщением. То здесь легко можно завязнуть на несколько страниц.

К сожалению, большинство экспертов присутствует именно на этом форуме...
Видимо, это как неискоренимый совок на почте или в какой-нибудь бухгалтерии, когда толстые тетеньки бальзаковского возраста цедят сквозь зубы "здрсьте". Вот и на этом форуме выработалась своя манера общения с полунамеками, типа захочешь - догадаешься

эксперты стараются сделать так, что-бы ты сам понял в чём ошибка. Т.е. не дать тебе готовое решение, как на большинстве западных ресурсов, я что-бы ты сам проделал некую работу, усвоил теоретические знания, и сам нашел ответ на свой вопрос.
Особенно это касается ситуаций, когда видно что у человека проблемы с теорией. Когда бывает редкая практическая ситуация - бывают дают и готовое решение.
27 мар 18, 09:52    [21288666]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
Гигабайт Мегабайтович Килобайтов
эксперты стараются сделать так, что-бы ты сам понял в чём ошибка

это я понимаю и идея хорошая. Но реализация, как обычно, подкачала.
Вы это делаете СЛИШКОМ витиевато.
Вместо краткого куска примерного кода, с которым можно разобраться, вы шлете в RTFM. Причем, на что конкретно из этого РТФМ вы намекаете, совсем непонятно.

Т.е. конкретно в моем примере (с чего начался этот топик) можно было просто сказать, что переменные "не достают" до вложенных кавычек. В итоге до этого я догадался сам с таким кодом (его я приводил выше):
declare
   @TmpSQL nvarchar(4000)

set @TmpSQL = 'print ''@qqq'''

exec sp_executesql @TmpSQL, N'@qqq varchar(100)', N'qwer'

Причем справку я перечитывал не один раз. Но то ли "глаз замылился", то ли еще что, но не видел я и не догадался, что переменная не передается во вложенные кавычки.
Хотя сейчас, когда все это понял, для меня это кажется логичным. Но для этого потребовалось увидеть пример выше.

Я и многие другие здесь вопрошающие (ну кроме студентов, да и то не всех) вовсе не требуем привести нам полностью рабочий готовый код.
Но нам нужен ПОНЯТНЫЙ намек для движения в нужном направлении.

В итоге простой вопрос "как пройти в библиотеку" превращается в квест:
- ногами. Бхахаха
- а с чего ты решил, что тебе нужно именно в библиотеку?
- обратись в справочную 09
- скачай карту города, поищи там
- координаты 123.456, 567.890

хотя нормальный ответ был бы: 2 квартала прямо, за светофором (он там один) налево, ну а там дальше спросишь
27 мар 18, 18:06    [21291016]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Гигабайт Мегабайтович Килобайтов
Member [заблокирован]

Откуда:
Сообщений: 5975
нуб987
Гигабайт Мегабайтович Килобайтов
эксперты стараются сделать так, что-бы ты сам понял в чём ошибка

это я понимаю и идея хорошая. Но реализация, как обычно, подкачала.
Вы это делаете СЛИШКОМ витиевато.
Вместо краткого куска примерного кода, с которым можно разобраться, вы шлете в RTFM. Причем, на что конкретно из этого РТФМ вы намекаете, совсем непонятно.

Т.е. конкретно в моем примере (с чего начался этот топик) можно было просто сказать, что переменные "не достают" до вложенных кавычек. В итоге до этого я догадался сам с таким кодом (его я приводил выше):
declare
   @TmpSQL nvarchar(4000)

set @TmpSQL = 'print ''@qqq'''

exec sp_executesql @TmpSQL, N'@qqq varchar(100)', N'qwer'

Причем справку я перечитывал не один раз. Но то ли "глаз замылился", то ли еще что, но не видел я и не догадался, что переменная не передается во вложенные кавычки.
Хотя сейчас, когда все это понял, для меня это кажется логичным. Но для этого потребовалось увидеть пример выше.

Я и многие другие здесь вопрошающие (ну кроме студентов, да и то не всех) вовсе не требуем привести нам полностью рабочий готовый код.
Но нам нужен ПОНЯТНЫЙ намек для движения в нужном направлении.

В итоге простой вопрос "как пройти в библиотеку" превращается в квест:
- ногами. Бхахаха
- а с чего ты решил, что тебе нужно именно в библиотеку?
- обратись в справочную 09
- скачай карту города, поищи там
- координаты 123.456, 567.890

хотя нормальный ответ был бы: 2 квартала прямо, за светофором (он там один) налево, ну а там дальше спросишь

таки ты не до конца понял ))
у тебя было две не верные посылки
1) тебе раз несколько сказали, что OPENROWSET используется только с константами. кто ж мог подумать, что ты не понял что такое "константа" в sql..
2) да то что ты нашел.
27 мар 18, 18:14    [21291052]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36987
нуб987
Я и многие другие здесь вопрошающие (ну кроме студентов, да и то не всех) вовсе не требуем привести нам полностью рабочий готовый код.
Но нам нужен ПОНЯТНЫЙ намек для движения в нужном направлении.
Мало ли что кому нужно. Мне вот может миллион долларов в день нужен, да взять негде. И в этом как бы не мой работодатель виноват.
27 мар 18, 18:14    [21291053]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql и openrowset  [new]
нуб987
Member

Откуда:
Сообщений: 50
Гавриленко Сергей Алексеевич
Мало ли что кому нужно. Мне вот может миллион долларов в день нужен, да взять негде. И в этом как бы не мой работодатель виноват.

если вы не желаете помочь, тогда можно ведь просто пройти мимо

Допускаю, что вы желаете помочь от чистого сердца, но делаете это "как-то не так".
Так же могу допустить, что я один не понимаю ваши намеки (тут я имею в виду не лично вас) и тогда это только мои проблемы. Но подобные моим комментарии я встречал здесь неоднократно: люди пишут, что на этом форуме манера общения слегка отдает высокомерием к менее опытным товарищам. Живой пример: Glory
Его ФАКи написаны доступным языком, редко-редко он может снизойти до реально понятного четкого и ясного ответа. Т.е. видно, что человек - профи.
Но в 99% его ответы заходят откуда-то ОЧЕНЬ издалека и не несут полезной части.

Это как пытаться дать понять муравью, что он идет не туда, поджигая и ломая все вокруг него. Да он просто офигеет от этого всего и решит, что судьба настроилась против него и в итоге повесится, не заметив узкой дорожки, которую вы оставили к новому муравейнику
27 мар 18, 18:28    [21291093]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить