Я столкнулся с той же проблемой между 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, я запускал скрипты.
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
Поскольку 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
Вы можете использовать параметр 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, ';', ''), '-', ''), '''', '')