Sample code for 30+ languages & platforms
SQL Server

AI: Simple Stateless Streaming Response

See more AI Examples

Shows a simple stateless query and receives the response in streaming mode.

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    DECLARE @iTmp0 int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    -- This example assumes the Chilkat API to have been previously unlocked.
    -- See Global Unlock Sample for sample code.

    DECLARE @ai int
    EXEC @hr = sp_OACreate 'Chilkat.Ai', @ai OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    -- The provider can be "openai", "google", "claude", "deepseek", "xai", or "perplexity".
    -- Support for additional providers will be added in future versions of Chilkat.
    EXEC sp_OASetProperty @ai, 'Provider', 'openai'

    -- Use your provider's API key.
    EXEC sp_OASetProperty @ai, 'ApiKey', 'MY_API_KEY'

    -- Choose a model.
    EXEC sp_OASetProperty @ai, 'Model', 'gpt-4o'

    -- Indicate streaming mode is to be used.
    EXEC sp_OASetProperty @ai, 'Streaming', 1

    -- Add a text input.
    EXEC sp_OAMethod @ai, 'InputAddText', @success OUT, 'Write a detailed story about a turtle who decides to run a bakery.  Describe the setting, the kinds of pastries, how the turtle feels, and include at least three paragraphs.'

    -- Ask the AI for text output.
    EXEC sp_OAMethod @ai, 'Ask', @success OUT, 'text'
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @ai, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @ai
        RETURN
      END

    DECLARE @sbEventName int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbEventName OUT

    DECLARE @sbDelta int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbDelta OUT

    DECLARE @sbFullResponse int
    EXEC @hr = sp_OACreate 'Chilkat.StringBuilder', @sbFullResponse OUT

    DECLARE @finished int
    SELECT @finished = 0
    DECLARE @abortFlag int
    SELECT @abortFlag = 0
    DECLARE @maxWaitMs int
    SELECT @maxWaitMs = 5000

    WHILE @finished = 0
      BEGIN

        DECLARE @result int
        EXEC sp_OAMethod @ai, 'PollAi', @result OUT, @abortFlag
        IF @result = 1
          BEGIN
            -- We have output waiting.  It should be instantly available.  The maxWaitMs is just-in-case.
            EXEC sp_OAMethod @ai, 'NextAiEvent', @success OUT, @maxWaitMs, @sbEventName, @sbDelta
            IF @success = 0
              BEGIN
                EXEC sp_OAGetProperty @ai, 'LastErrorText', @sTmp0 OUT
                PRINT @sTmp0
                EXEC @hr = sp_OADestroy @ai
                EXEC @hr = sp_OADestroy @sbEventName
                EXEC @hr = sp_OADestroy @sbDelta
                EXEC @hr = sp_OADestroy @sbFullResponse
                RETURN
              END

            -- Some AI providers send many "empty" events.  Just ignore them.
            EXEC sp_OAMethod @sbEventName, 'ContentsEqual', @iTmp0 OUT, 'empty', 1
            IF @iTmp0 = 0
              BEGIN
                -- Log the non-empty events.
                EXEC sp_OAMethod @sbEventName, 'GetAsString', @sTmp0 OUT
                PRINT @sTmp0

                -- The delta contains the new output.  This could be emitted to a display or the terminal
                -- as real-time output.
                EXEC sp_OAMethod @sbEventName, 'ContentsEqual', @iTmp0 OUT, 'delta', 1
                IF @iTmp0 = 1
                  BEGIN
                    EXEC sp_OAMethod @sbDelta, 'GetAsString', @sTmp0 OUT
                    PRINT @sTmp0

                    -- Accumulate the delta's so we can show the full response later.
                    EXEC sp_OAMethod @sbFullResponse, 'AppendSb', @success OUT, @sbDelta
                  END
                ELSE
                  BEGIN
                    -- A streaming AI response is always terminated by a single "null_terminator" event.
                    EXEC sp_OAMethod @sbEventName, 'ContentsEqual', @finished OUT, 'null_terminator', 1
                  END
              END
          END
        ELSE
          BEGIN
            IF @result = 0
              BEGIN
                -- Nothing is immediately available. Sleep for 1/10 of a second before polling again.
                EXEC sp_OAMethod @ai, 'SleepMs', NULL, 100
              END
            ELSE
              BEGIN
                -- Something failed..
                EXEC sp_OAGetProperty @ai, 'LastErrorText', @sTmp0 OUT
                PRINT @sTmp0
                SELECT @finished = 1
              END
          END
      END

    -- Show the accumulated (full) response.

    PRINT '----'
    EXEC sp_OAMethod @sbFullResponse, 'GetAsString', @sTmp0 OUT
    PRINT @sTmp0

    -- -------------------------------------------------------------
    -- The response is in markdown format.
    -- Also see Markdown to HTML Conversion Examples.
    -- -------------------------------------------------------------

    EXEC @hr = sp_OADestroy @ai
    EXEC @hr = sp_OADestroy @sbEventName
    EXEC @hr = sp_OADestroy @sbDelta
    EXEC @hr = sp_OADestroy @sbFullResponse


END
GO