вызов одного хранимого процесса из другого путем выполнения команды

Я столкнулся с той же проблемой между python27-apple и python27 (установленным Macport). Я пробовал эти шаги, и это сработало для меня.

Согласно комментариям @ Evert от разных библиотек, используемых разными python, я попытался вернуть python27-apple в «active».

sudo port select --list python

Для моего компьютера это показало:

Available versions for python:
none
python25-apple
python26
python26-apple
python27 (active)
python27-apple

, в котором python27 (по Macport) в настоящее время активен. Затем

sudo port select python python27-apple

, чтобы сделать python27-apple активным, поскольку lib по умолчанию был вызван ранее. Чтобы дважды проверить,

sudo port select --list python

Теперь он показал:

Available versions for python:
none
python25-apple
python26
python26-apple
python27
python27-apple (active)

И когда произошел сбой python, я запускал скрипты.

1
задан Joe Stefanelli 17 August 2010 в 20:02
поделиться

3 ответа

Friend Function execSP(ByVal spName As String, Optional ByVal params As Collection = Nothing) As Integer
        Dim cmd As SqlCommand
        Dim param As SqlParameter
        Dim ret As Integer
        Dim iParam As Integer

        cmd = New SqlCommand
        cmd.CommandText = spName
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = _sqlConn
        cmd.CommandTimeout = 0

        If Not params Is Nothing Then
            For iParam = 1 To params.Count
                param = params(iParam)
                cmd.Parameters.Add(param)
            Next
        End If

        If _sqlConn.State <> ConnectionState.Open Then
            _sqlConn.Open()
        End If

        Try
            ret = cmd.ExecuteNonQuery()
        Catch ex As Exception
            Throw New Exception(ex.Message)
        Finally
            _sqlConn.Close()
        End Try
        Return ret
    End Function
0
ответ дан 2 September 2019 в 22:04
поделиться

Поскольку EXEC работает в другом контексте, он не знает вашей переменной @curr_id. Вместо этого вы можете поместить вывод динамического SQL в табличную переменную, а затем использовать ее для установки @curr_id.

Кроме того, никогда не запускает имя хранимой процедуры с sp_ .

    ALTER PROCEDURE [dbo].[usp_astm_getcurrid]
        @ColName as nvarchar(250),
        @TblName as nvarchar(250),
        @curr_id nvarchar(max) OUTPUT 
    AS
    BEGIN
        DECLARE @cmd nvarchar(max)

        declare @dummy table (
            ReturnColumn nvarchar(max)
        )

        SET @cmd = N'SELECT MAX(' + @ColName + N') FROM ' + @TblName;

        insert into @dummy
            (ReturnColumn)
            exec (@cmd)

        set @curr_id = (select ReturnColumn from @dummy)
    END

Тогда пример вызова этой процедуры изнутри другой может быть примерно таким. Важным ключом является использование ключевого слова OUTPUT здесь, в вызове, а также в объявлении процедуры, описанной выше.

    CREATE PROCEDURE CallMyProcedure
    AS
    BEGIN
        declare @curr_id nvarchar(max)
        exec dbo.usp_astm_getcurrid N'YourColumnName', N'YourTableName', @curr_id OUTPUT
        select @curr_id
    END
2
ответ дан 2 September 2019 в 22:04
поделиться

Вы можете использовать параметр OUTPUT в sp_executesql:

ALTER PROCEDURE [dbo].[sp_astm_getcurrid] 
@ColName as nvarchar(250), 
@TblName as nvarchar(250), 
@curr_id nvarchar(max) OUTPUT  
AS 
BEGIN 

DECLARE 
  @cmd nvarchar(max)

SET @cmd =N'SELECT @curr_id_out = MAX('+@ColName+') FROM '+@TblName 

EXEC sp_executesql 
  @cmd, 
  N'@curr_id_out nvarchar(max) OUTPUT', 
  @curr_id_out = @curr_id OUTPUT

END 

Было бы упущением не упомянуть, что в данном случае использование EXEC( @cmd) или sp_executesql(@cmd) делает вас уязвимыми для инъекций SQL.

Я рекомендую добавить в начало хранимой процедуры что-то вроде следующего:

SELECT 
  @ColName = REPLACE(
             REPLACE(
             REPLACE(@ColName, ';', ''), '-', ''), '''', ''),
  @TblName = REPLACE(
             REPLACE(
             REPLACE(@TblName, ';', ''), '-', ''), '''', '')
0
ответ дан 2 September 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: