powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_executesql и openrowset
25 сообщений из 27, страница 1 из 2
sp_executesql и openrowset
    #39620606
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на MSSQL2000 пишу такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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


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

Затем пишу такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
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: ].

не могу понять, почему?... Запросы-то одинаковые.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620623
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620630
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтовнуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))
а вы как думаете, догадаюсь ли я, если еще не догадался? ))

млин, ну ясно же, что если бы догадался, то и не спрашивал бы.
Понимаю, что где-то или опечатался или тупанул. Но не вижу...
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620631
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

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

Код: sql
1.
'SERVER='+@SrvName+';Database='+@DBName
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620636
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовнуб987,

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

Код: sql
1.
'SERVER='+@SrvName+';Database='+@DBName


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

Или вы хотите сказать, что я в принципе сделал неверно и следовало написать так?:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 с его параметрами?
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620640
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а с чего вы решили, что openrowset позволяет такие вольности?
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620645
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа с чего вы решили, что openrowset позволяет такие вольности?
такие - какие?
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620654
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

sp_executesql редко использую, но, если правильно помню, эта процедура служит для передачи значений переменным или параметрам. Т.е. она не работает как макроподстановщик.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620655
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987Konst_Oneа с чего вы решили, что openrowset позволяет такие вольности?
такие - какие?
sp_executesql не подставляет значения, а объявлет ваши переменные и задаёт их значения, OPENROWSET не поддерживает переменные в строке подключения
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620661
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987Гигабайт Мегабайтович Килобайтовнуб987,

потому что у вас две ошибки во втором варианте.
Догадаетесь сами какие? ))
а вы как думаете, догадаюсь ли я, если еще не догадался? ))

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

то что в OPENROWSET передаются только строковые константы, в них не может быть переменных. Это раз
так как вы написали - как раз и является строковой константой - это два ))
И так-же три - ваши переменные не приходят в sp_executesql, так как в тексте он не находит никаких переменных.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620665
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKнуб987пропущено...

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

Вот другой пример:
Код: sql
1.
2.
3.
4.
5.
6.
declare
   @TmpSQL nvarchar(4000)

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

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



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

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


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


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



Итого:
писать все-таки придется как подсказал Владислав Колосов:
Код: sql
1.
'SERVER='+@SrvName+';Database='+@DBName
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620669
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

нунахрен....
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620670
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+100
ну...
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620671
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

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

Слева переменная внутренняя, справа переменная внешняя.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620672
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserнуб987,

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

Слева переменная внутренняя, справа переменная внешняя.
а хелп вы когда-нибудь открывали?
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620676
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKнуб987,

нунахрен....
это да...
а как по-человечески это сделать?
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620677
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620682
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620688
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKblonduserTaPaK,
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 читал несколько раз
думал еще больше раз

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

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

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

К сожалению, большинство экспертов присутствует именно на этом форуме...
Видимо, это как неискоренимый совок на почте или в какой-нибудь бухгалтерии, когда толстые тетеньки бальзаковского возраста цедят сквозь зубы "здрсьте". Вот и на этом форуме выработалась своя манера общения с полунамеками, типа захочешь - догадаешься
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620897
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987,

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

коротко - не нужно зпт не ошибка как делает ТС зпт ошибка не из-за этого зпт подробности письмом(msdn) тчк
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39620921
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987TaPaKпропущено...


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

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

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

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

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

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

К сожалению, большинство экспертов присутствует именно на этом форуме...
Видимо, это как неискоренимый совок на почте или в какой-нибудь бухгалтерии, когда толстые тетеньки бальзаковского возраста цедят сквозь зубы "здрсьте". Вот и на этом форуме выработалась своя манера общения с полунамеками, типа захочешь - догадаешься
эксперты стараются сделать так, что-бы ты сам понял в чём ошибка. Т.е. не дать тебе готовое решение, как на большинстве западных ресурсов, я что-бы ты сам проделал некую работу, усвоил теоретические знания, и сам нашел ответ на свой вопрос.
Особенно это касается ситуаций, когда видно что у человека проблемы с теорией. Когда бывает редкая практическая ситуация - бывают дают и готовое решение.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39621496
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гигабайт Мегабайтович Килобайтовэксперты стараются сделать так, что-бы ты сам понял в чём ошибка
это я понимаю и идея хорошая. Но реализация, как обычно, подкачала.
Вы это делаете СЛИШКОМ витиевато .
Вместо краткого куска примерного кода, с которым можно разобраться, вы шлете в RTFM. Причем, на что конкретно из этого РТФМ вы намекаете, совсем непонятно.

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

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

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


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

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

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

хотя нормальный ответ был бы: 2 квартала прямо, за светофором (он там один) налево, ну а там дальше спросишь
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39621502
Гигабайт Мегабайтович Килобайтов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987Гигабайт Мегабайтович Килобайтовэксперты стараются сделать так, что-бы ты сам понял в чём ошибка
это я понимаю и идея хорошая. Но реализация, как обычно, подкачала.
Вы это делаете СЛИШКОМ витиевато .
Вместо краткого куска примерного кода, с которым можно разобраться, вы шлете в RTFM. Причем, на что конкретно из этого РТФМ вы намекаете, совсем непонятно.

Т.е. конкретно в моем примере (с чего начался этот топик) можно было просто сказать, что переменные "не достают" до вложенных кавычек. В итоге до этого я догадался сам с таким кодом (его я приводил выше):
Код: sql
1.
2.
3.
4.
5.
6.
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) да то что ты нашел.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39621503
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нуб987Я и многие другие здесь вопрошающие (ну кроме студентов, да и то не всех) вовсе не требуем привести нам полностью рабочий готовый код.
Но нам нужен ПОНЯТНЫЙ намек для движения в нужном направлении.Мало ли что кому нужно. Мне вот может миллион долларов в день нужен, да взять негде. И в этом как бы не мой работодатель виноват.
...
Рейтинг: 0 / 0
sp_executesql и openrowset
    #39621514
нуб987
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичМало ли что кому нужно. Мне вот может миллион долларов в день нужен, да взять негде. И в этом как бы не мой работодатель виноват.
если вы не желаете помочь, тогда можно ведь просто пройти мимо

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

Это как пытаться дать понять муравью, что он идет не туда, поджигая и ломая все вокруг него. Да он просто офигеет от этого всего и решит, что судьба настроилась против него и в итоге повесится, не заметив узкой дорожки, которую вы оставили к новому муравейнику
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sp_executesql и openrowset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]