powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат хранимки через ADO
25 сообщений из 47, страница 1 из 2
Результат хранимки через ADO
    #39109713
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
USE [tam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[fn_FldType] (@tabName nvarchar(50), @fldName nvarchar(50))
RETURNS nvarchar(50)
AS
BEGIN
	DECLARE @fldType nvarchar(50)

	SELECT @fldType = 
		CONVERT(nvarchar,(SELECT TYPE_NAME(c.user_type_id) AS TypeName	
		FROM sys.objects AS o JOIN sys.columns AS c  ON o.object_id = c.object_id
		WHERE o.name=@tabName and c.name=@fldName))	

	RETURN @fldType
END


хранимка, где она юзается:
Код: 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.
USE [tam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Данные в строку
ALTER PROCEDURE [dbo].[hp_SQLstr] 
	@SQL nvarchar(3000), @tabName nvarchar(50), @fldName nvarchar(50), @spr nvarchar(5), @ResultVar nvarchar(3000) OUTPUT
AS
DECLARE @fldType nvarchar(50), @fldName_tmp nvarchar(50), @SQL_tmp nvarchar(3000)
 
BEGIN
	SET NOCOUNT ON;

	SELECT @fldType = (SELECT dbo.fn_FldType(@tabName, @fldName))
	IF @fldType = 'int' OR @fldType = 'decimal'
		SET @fldName_tmp = 'CONVERT(nvarchar,' + @fldName + ')'
	IF @fldType = 'smalldatetime' OR @fldType = 'datetime'
		SET @fldName_tmp = 'CONVERT(nvarchar,' + @fldName + ', 104)'
	
	If CHARINDEX('ORDER BY', @SQL) > 0 And CHARINDEX('TOP', @SQL) = 0 
		SET @SQL = REPLACE(@SQL, 'SELECT ', 'SELECT TOP 100 PERCENT ')

	SET @SQL_tmp =
		'SELECT @ResultVar = (SELECT (SELECT DISTINCT ' + @fldName_tmp + '+''' + @spr + '''' + 
		' FROM (' + REPLACE(@SQL, '''', '''''') + ') AS tmp FOR XML PATH('''')) collate Cyrillic_General_100_CI_AS)'
	EXEC sp_executesql @SQL_tmp, N'@ResultVar nvarchar(3000) OUTPUT', @ResultVar = @ResultVar OUTPUT
	IF @ResultVar <> '' 
		SET @ResultVar = SUBSTRING(@ResultVar, 1, Len(@ResultVar) - 1)
END


Запускаю в менеджере SQL
Код: sql
1.
2.
3.
4.
USE tam;
DECLARE @ResultVar nvarchar(1000);
EXECUTE hp_SQLstr 'SELECT Zak_ID FROM tab_Zakaz', 'tab_Zakaz', 'Zak_ID', ',', @ResultVar OUTPUT;
SELECT @ResultVar;


выдает 1,2,3... и т. д. - работает стало быть

Запускаю через ADO (VBA):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim sSQL As String, ResultVar As String

sSQL = _
    "USE tam;" & _
    "DECLARE @ResultVar nvarchar(1000);" & _
    "EXECUTE hp_SQLstr 'SELECT Zak_ID FROM tab_Zakaz', 'tab_Zakaz', 'Zak_ID', ',', @ResultVar OUTPUT;" & _
    "SELECT @ResultVar AS RecVar;"
ResultVar = Nz(con.Execute(sSQL).NextRecordset.Fields(0), "")


выдает "переменная объекта или переменная не задана"
другие процедуры, запускаемые аналогично отрабатываются, эта не хочет. В чем прикол?

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109728
Palarm,

дык в форуме VB и надо спрашивать
пока вероятность того что какой-нибудь con не инициализирован примерно равна вероятности того что что-то не так с OUTPUT у адо
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109734
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim sSQL As String, ResultVar As String

sSQL = _
    "USE tam;" & _
    "SET NOCOUNT ON " & _
    "DECLARE @ResultVar nvarchar(1000);" & _
    "EXECUTE hp_SQLstr 'SELECT Zak_ID FROM tab_Zakaz', 'tab_Zakaz', 'Zak_ID', ',', @ResultVar OUTPUT;" & _
    "SELECT @ResultVar AS RecVar;"
ResultVar = Nz(con.Execute(sSQL).Fields(0), "")

и еще SET NOCOUNT ON первой строкой в хранимку.

А вообще, в ADO есть ADODB.Command для выполнения процедур
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109825
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Родил таки:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim ResultVar As String
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command

Set cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "hp_SQLstr"

cmd.Parameters.Append cmd.CreateParameter("@SQL", adVarWChar, adParamInput, 3000, "select zak_id from tab_zakaz")
cmd.Parameters.Append cmd.CreateParameter("@tabName", adVarWChar, adParamInput, 50, "tab_Zakaz")
cmd.Parameters.Append cmd.CreateParameter("@fldName", adVarWChar, adParamInput, 50, "Zak_ID")
cmd.Parameters.Append cmd.CreateParameter("@spr", adVarWChar, adParamInput, 5, ",")
cmd.Parameters.Append cmd.CreateParameter("@ResultVar", adVarWChar, adParamOutput, 3000)
cmd.Execute , , adExecuteNoRecords
ResultVar = cmd.Parameters("@ResultVar").Value



Но блин, только с этой хранимкой такая трабла, остальные отрабатываются как выше написал.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109832
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что другие хранимки не генерят дополнительные сообщения (которые подавляет set nocount on)

ЗЫ: Если лень писать кучу CreateParameter, есть Parametes.Refresh, который получает готовую коллекцию параметров с сервера (лишний, но часто не очень принципиальный запрос к серверу)
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109836
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command

cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "hp_SQLstr"
cmd.Parameters.Refresh
cmd.Execute , Array("select zak_id from tab_zakaz", "tab_Zakaz", "Zak_ID", ",", ""), adExecuteNoRecords
fun = cmd.Parameters("@ResultVar").Value


Получаем Null.
Хотелось бы функцию на VB сделать, типа:

funSQLstr("параметры через разделитель")

почему и потребность запустить хранимку с минимумом букв. Но если через CreateParameter делать, придется кроме вышеназванных еще и adVarWChar (или другой какой тип) и длину указывать. Потому как при adBSTR выдает опять же Null, а adVarWChar требует обязательной длины строки.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109838
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПотому что другие хранимки не генерят дополнительные сообщения (которые подавляет set nocount on)А почему тогда к примеру эта работает по старому вызову?
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
USE [tam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Вставка цен ТМЦ по разрешительным документам
ALTER PROCEDURE [dbo].[hp_InsertWrDoc] 
	@MatCenaID INT, @KartID INT, @RecCnt INT OUTPUT
AS
DECLARE @FROM nvarchar(1000), @SQL nvarchar(3000)
 
BEGIN
	SET NOCOUNT ON;

	--вставка в карточку ТМЦ
	IF @MatCenaID = 0
		BEGIN
			SET @FROM = 
				'FROM	tab_WRDoc INNER JOIN 
						tab_UKT_ZED_WRDoc ON tab_WRDoc.WRD_ID = tab_UKT_ZED_WRDoc.WRD_ID INNER JOIN 
						tab_MKart ON tab_UKT_ZED_WRDoc.UKT_ID = tab_MKart.UKT_ID 
				 WHERE  tab_MKart.Kart_ID=' + CONVERT(nvarchar,@KartID) + ' AND tab_WRDoc.WRD_ID NOT IN
						(SELECT WRD_ID 
						FROM	tab_MCena_WRDoc 
						WHERE	Kart_ID=' +  CONVERT(nvarchar,@KartID) + ')'
			SET @SQL = 'SELECT @RecCnt = COUNT(*) ' + @FROM 
			EXEC sp_executesql @SQL, N'@RecCnt INT OUTPUT', @RecCnt = @RecCnt OUTPUT
			IF  @RecCnt > 0
				BEGIN
					SET @SQL = 
						'INSERT INTO tab_MCena_WRDoc (Kart_ID, WRD_ID)
						SELECT ' + CONVERT(nvarchar,@KartID) + ',tab_WRDoc.WRD_ID ' + @FROM
					EXEC sp_executesql @SQL
				END
		END
	ELSE --вставка в цены ТМЦ
		BEGIN
	        SET @FROM = 
            'FROM   tab_MCena_WRDoc 
			WHERE	Kart_ID=' +  CONVERT(nvarchar,@KartID) + ' AND ISNULL(NumDoc,N'''')='''' AND WRD_ID NOT IN
					(SELECT WRD_ID 
					FROM	tab_MCena_WRDoc 
					WHERE	MatCena_ID=' + CONVERT(nvarchar,@MatCenaID) + ')'
			SET @SQL = 'SELECT @RecCnt = COUNT(*) ' + @FROM
			EXEC sp_executesql @SQL, N'@RecCnt INT OUTPUT', @RecCnt = @RecCnt OUTPUT
			IF  @RecCnt > 0
				BEGIN
					SET @SQL = 
						'INSERT INTO tab_MCena_WRDoc(MatCena_ID, WRD_ID)
						SELECT ' + CONVERT(nvarchar,@MatCenaID) + ',tab_MCena_WRDoc.WRD_ID ' + @FROM
					EXEC sp_executesql @SQL
				END
		END
END


"дополнительные сообщения" - что имеете в виду?
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109860
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PalarmА почему тогда к примеру эта работает по старому вызову?потому что в ней есть set nocount on

Palarm"дополнительные сообщения" - что имеете в виду?типа тех, которые выдает студия после выполнения запроса: "(1 row(s) affected)", а также варнинги, принты и т.п. Чтобы их все перебрать на клиенте используется NextRecordset в нужном количестве. А поскольку морочиться нужным количеством дело неблагодарное, обычно их подавляют set nocount on
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39109866
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarm
Код: vbnet
1.
cmd.Execute , Array("sel


msdnParameters
Optional. A Variant array of parameter values used in conjunction with the input string or stream specified in CommandText or CommandStream. (Output parameters will not return correct values when passed in this argument.)

я никогда так не вызывал, просто писал:
Код: vbnet
1.
2.
cmd.Parameters("@MyParameter1") = Value1
cmd.Parameters("@MyParameter2") = "Value2"

не знаю, как себя поведет указание Parameters в Execute, но по хелпу мне кажется, что это не то

разумеется, была функция-обертка для вызова процедур
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110016
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что в ней есть set nocount on
его не было только в функции - добавил туда, так же требует чего то задать. Ставить подавление первой строкой тоже не помогло. Чую, тут какая то фигня простая, а мессага может вообще не о том верещит. Ну да пес с ней, сделал обертку конкретно под эту хранимку.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Function funSQLStr(ByVal sSQL As String, ByVal sTabFieldName As String, Optional ByVal sSeparator As String) As String
Dim cmd As ADODB.Command

On Error GoTo Err_
    If sSeparator = "" Then sSeparator = ","

    Set cmd = New ADODB.Command
    cmd.ActiveConnection = CollCon(ConName)
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "hp_SQLstr"
    
    cmd.Parameters.Append cmd.CreateParameter("@SQL", adVarWChar, adParamInput, 3000, sSQL)
    cmd.Parameters.Append cmd.CreateParameter("@tabName", adVarWChar, adParamInput, 50, Split(sTabFieldName, ".")(0))
    cmd.Parameters.Append cmd.CreateParameter("@fldName", adVarWChar, adParamInput, 50, Split(sTabFieldName, ".")(1))
    cmd.Parameters.Append cmd.CreateParameter("@spr", adVarWChar, adParamInput, 5, sSeparator)
    cmd.Parameters.Append cmd.CreateParameter("@ResultVar", adVarWChar, adParamOutput, 3000)
    cmd.Execute , , adExecuteNoRecords
    funSQLStr = cmd.Parameters("@ResultVar").Value
Exit Function

Err_:
    Call ErrorBases(Err, "mdl_Tools", "funSQLStr")
End Function
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110020
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что хранимка не пашет через execute потому, что там есть вызов функции, чего нет в других хранимках, которые запускаются нормально. По крайней мере вызов самой функции дает такую же месагу, если делать так:
Код: vbnet
1.
ResultVar = Nz(con.Execute("SELECT dbo.fn_FldType('tab_Zakaz','Zak_ID')"), "")


А в менеджере отрабатывает нормально. И запуск хранимки в другой хранимке так же отрабатывает нормально:
Код: vbnet
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.
32.
33.
34.
35.
36.
37.
38.
39.
USE [tam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Вставка разрешительных документов
ALTER PROCEDURE [dbo].[hp_InsertMCenaWrDocZak] 
	@ZakID INT, @sInsertRecords varchar(3000), @RecCount INT OUTPUT
AS
DECLARE @MatCenaID INT

BEGIN
	SET NOCOUNT ON;

	IF (SELECT Kart_ID FROM tab_MCena WHERE Zak_ID = @ZakID) = 0
		BEGIN
			DECLARE Cur1 CURSOR LOCAL FAST_FORWARD FOR
			SELECT MatCena_ID FROM tab_MCena Where MatCena_ID IN(REPLACE(@sInsertRecords, '|', ','))
		END
	ELSE
		BEGIN
			DECLARE Cur1 CURSOR LOCAL FAST_FORWARD FOR
			SELECT MatCena_ID FROM tab_MCena WHERE MatCena_ID IN(REPLACE(@sInsertRecords, '|', ',')) AND Kart_ID NOT IN(SELECT Kart_ID FROM tab_MCena WHERE Zak_ID = @ZakID)  
		END

	SET @RecCount = 0
	OPEN Cur1
	FETCH NEXT FROM cur1 INTO @MatCenaID
	WHILE @@FETCH_STATUS = 0
	BEGIN
		EXEC dbo.hp_InsertMCenaWrDocZak_sub @ZakID, @MatCenaID
		FETCH NEXT FROM Cur1 INTO @MatCenaID
		SET @RecCount = @RecCount + 1
	END

	CLOSE Cur1
	DEALLOCATE Cur1
END


Стало быть все зло от функций - осталось лишь найти какое. Было бы проще (меньше буковок писать) во многих случаях вместо хранимок с выходными параметрами вызывать функции через Execute - но они вообще так не взлетают. Видимо надо делать их запуск так же через cmd.Parameters с оберткой на VB?
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110057
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarmвызов самой функции дает такую же месагу, если делать так:
Код: vbnet
1.
ResultVar = Nz(con.Execute("SELECT dbo.fn_FldType('tab_Zakaz','Zak_ID')"), "")

потому что тут-то возвращается рекордсет и надо обращаться с ним как с рекордсетом:

Код: vbnet
1.
ResultVar = con.Execute("SELECT dbo.fn_FldType('tab_Zakaz','Zak_ID')").Fields(0).Value




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

Еще момент - пользователь, под которым ты выполняешь это в студии и в АДО. Дело в том, что при обычной процедуре достаточно прав только на процедуру, в случае же динамических запросов нужны права на все объекты, которые выполняются в динамике и все таблицы которые запрашиваются в динамике.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110063
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпотому что тут-то возвращается рекордсет и надо обращаться с ним как с рекордсетом
Точно! :)

Shocker.ProЕще момент - пользователь, под которым ты выполняешь это в студии и в АДО. Дело в том, что при обычной процедуре достаточно прав только на процедуру, в случае же динамических запросов нужны права на все объекты, которые выполняются в динамике и все таблицы которые запрашиваются в динамике.Это да, но у меня пока смешанная авторизация: коннект к серваку через sa либо юзера с правами на все объекты кроме их модификации - а дальше на клиенте раздача на объекты приложения. Когда доберусь до админских дел - это будет отдельная грабля.
Спасибо за помощь :)
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110370
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лапочка однако оказалась не та, пришлось ее разбить. Собрать данные в строку из запроса типа
Код: sql
1.
select zak_id from tab_zakaz


не вопрос, а вот начиная с
Код: sql
1.
select convert(varchar, zak_id) as Rec from tab_zakaz


пошли пляски с бубном
Код: sql
1.
select convert(varchar, zak_id) + ' - ' convert(varchar, zak_id) AS ...


тут вообще карнавал. Потому как пишут в тырнетах и сам убедился динамический запрос типа
Код: sql
1.
' ... FROM (' + @SQL + ')...


ацкое зло. Прикольно, что funSQLStr() у меня вообще то есть на VBA и работает прекрасно со всякими запросами, потому что траблы кавычками там не выходит. Дай думаю ее на T-SQL сделаю, говорят перенос логики на сервер признак ума. Ага
Как говорится: не мешай механизму работать.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110502
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вообще не очень понял, зачем ты там динамику пилишь. Динамика на сервере обычно требуется редко.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110537
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proя вообще не очень понял, зачем ты там динамику пилишь. Динамика на сервере обычно требуется редко.В hp_SQLstr текст запроса является параметром, стало быть только динамикой и можно, в hp_InsertWrDoc пара предложений FROM одинаковые в двух местах, чтобы не писать 2 раза одно и тоже сделал динамический запрос. Привычка оптимизировать код, избегая копипаста.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110572
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PalarmВ hp_SQLstr текст запроса является параметромэто я вижу, но, повторяю, я не понимаю зачем. По хорошему, клиент не должен думать о деталях хранения информации, и уж тем более не иметь никакого понятия о языке SQL.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39110573
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarmпара предложений FROM одинаковые в двух местахобычно такое оформляется в виде INLINE UDF или VIEW
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111282
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне нужен только текст FROM - как создать VIEW без SELECT - не представляю.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111312
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarmмне нужен только текст FROMскорее всего у тебя кривой подход, обычно не должно возникать в принципе такой необходимости. Если есть повторяемость, создаются подзапросы, которые можно вынести в VIEW или INLINE UDF.

Нет, не спорю, существуют ситуации, когда запрос приходится именно конструировать, но это исключение, а не правило. Возможно, у тебя есть в этом необходимость, но "FROM одинаковые в двух местах" - это не основание, для этого делают представления.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111314
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarmмне нужен только текст FROM - как создать VIEW без SELECT - не представляю.по другому - ты мыслишь не теми категориями, видимо очень много лепил динамических запросов на клиенте в свое время. На TSQL так не пишут.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111417
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеешь в виду, что надо сделать что то вроде:
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111430
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
CREATE VIEW v_tmp
AS 
SELECT ... AS Rec
FROM ....
WHERE ...


а потом уже это подставлять в итоговый запрос как вложенное представление? Хотя странный подход - динамический вроде проще и нагляднее
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111472
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Palarmпроще и нагляднеепочитай себя сам, что я могу добавить?
Palarmтут вообще карнавалPalarmпошли пляски с бубномPalarmсам убедился динамический запрос .... ацкое зло.если запрос, разбавленный множеством кавычек, конкатенаций, convert-ов, задвоенных кавычек, без подсветки синтаксиса и т.п. проще и нагляднее - пиши динамику.

Еще. Динамика компилируется каждый раз при вызове, каждый раз производится анализ таблиц и составляется план запроса. Не динамический запрос компилируется сразу, план составляется тоже сразу. Излишне говорить, что это влияет на производительность.
...
Рейтинг: 0 / 0
Результат хранимки через ADO
    #39111483
Фотография Palarm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так?
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
USE [tam]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--Источники данных форм и контролов
ALTER PROCEDURE [dbo].[hp_ObjSource] 
	@ObjName varchar(50), @RecKey INT = 0, @RecKeyList nvarchar(50) = ''
AS
DECLARE @DopWhere nvarchar(50), @SQL nvarchar(1000)
 
BEGIN
	SET NOCOUNT ON;

	--Списки
	IF @ObjName = 'UP_ID'
		SELECT UP_ID, UPKod + ' - ' + UPName AS UKod FROM tab_UsPostawki WHERE Sost=0 ORDER BY UPKod
	IF @ObjName = 'TR_ID'
		SELECT TR_ID, NameYur FROM tab_Customs_Region WHERE Sost=0 ORDER BY NameYur
	IF @ObjName = 'TTD_ID'
		SELECT TTD_ID, TTName FROM tab_Decl_Type WHERE Sost=0 ORDER BY TTName
	IF @ObjName = 'WName'
		SELECT WName FROM tab_WType WHERE Sost=0 ORDER BY WName
	IF @ObjName = 'CT_ID'
		SELECT CT_ID, Alfa2 + ' - ' + Country_Ukr FROM tab_Country WHERE Sost=0 ORDER BY Country_Ukr
	IF @ObjName = 'BR_ID'
		SELECT tab_Border.BR_ID, tab_Border.Name_In + ' - ' + tab_Border.Name_Out + ' (' + tab_Country.Country_Ukr + ')' AS RecName
        FROM   tab_Border INNER JOIN
               tab_Country ON tab_Border.CT_ID = tab_Country.CT_ID
        WHERE  tab_Border.Sost=0
        ORDER BY tab_Border.Favor DESC, RecName
	IF @ObjName = 'TR_Key'
		SELECT TR_Key, NameYur FROM tab_Customs_Region WHERE Sost=0 ORDER BY NameYur
	IF @ObjName = 'OrgKey'
		BEGIN
			IF (SELECT COUNT(*) FROM sys.objects AS O WHERE O.NAME='v_tmp') > 0
				DROP VIEW v_tmp
			ELSE
				EXEC ('CREATE VIEW v_tmp AS
					SELECT	OrgType, OrgKey, CASE WHEN ISNULL(NameSokr, '''')='''' THEN NameYur ELSE NameSokr END AS RecFld
					FROM	tab_Org
					WHERE	Sost=0')
			IF @RecKeyList = ''
				SELECT	OrgKey, RecFld
				FROM	v_tmp
				WHERE	OrgType=@RecKey
			ELSE
				BEGIN
					IF CHARINDEX('NOTIN', @RecKeyList) > 0
						BEGIN
							SET @DopWhere = SUBSTRING(@RecKeyList, 7, Len(@RecKeyList));
							SELECT	OrgKey, RecFld
							FROM	v_tmp
							WHERE	OrgType NOT IN(SELECT number FROM dbo.iter_intlist_to_table(@DopWhere))
						END					
					ELSE
						IF CHARINDEX('IN', @RecKeyList) > 0
							BEGIN
								SET @DopWhere = SUBSTRING(@RecKeyList, 3, Len(@RecKeyList));
								SELECT	OrgKey, RecFld
								FROM	v_tmp
								WHERE	OrgType IN(SELECT number FROM dbo.iter_intlist_to_table(@DopWhere))
							END									
				END
			DROP VIEW v_tmp
		END
END
...
Рейтинг: 0 / 0
25 сообщений из 47, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат хранимки через ADO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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