package mssql import ( "encoding/binary" ) type procId struct { id uint16 name string } // parameter flags const ( fByRevValue = 1 fDefaultValue = 2 ) type param struct { Name string Flags uint8 ti typeInfo buffer []byte } const ( fWithRecomp = 1 fNoMetaData = 2 fReuseMetaData = 4 ) var ( sp_Cursor = procId{1, ""} sp_CursorOpen = procId{2, ""} sp_CursorPrepare = procId{3, ""} sp_CursorExecute = procId{4, ""} sp_CursorPrepExec = procId{5, ""} sp_CursorUnprepare = procId{6, ""} sp_CursorFetch = procId{7, ""} sp_CursorOption = procId{8, ""} sp_CursorClose = procId{9, ""} sp_ExecuteSql = procId{10, ""} sp_Prepare = procId{11, ""} sp_PrepExec = procId{13, ""} sp_PrepExecRpc = procId{14, ""} sp_Unprepare = procId{15, ""} ) // http://msdn.microsoft.com/en-us/library/dd357576.aspx func sendRpc(buf *tdsBuffer, headers []headerStruct, proc procId, flags uint16, params []param, resetSession bool) (err error) { buf.BeginPacket(packRPCRequest, resetSession) writeAllHeaders(buf, headers) if len(proc.name) == 0 { var idswitch uint16 = 0xffff err = binary.Write(buf, binary.LittleEndian, &idswitch) if err != nil { return } err = binary.Write(buf, binary.LittleEndian, &proc.id) if err != nil { return } } else { err = writeUsVarChar(buf, proc.name) if err != nil { return } } err = binary.Write(buf, binary.LittleEndian, &flags) if err != nil { return } for _, param := range params { if err = writeBVarChar(buf, param.Name); err != nil { return } if err = binary.Write(buf, binary.LittleEndian, param.Flags); err != nil { return } err = writeTypeInfo(buf, ¶m.ti) if err != nil { return } err = param.ti.Writer(buf, param.ti, param.buffer) if err != nil { return } } return buf.FinishPacket() }