SQL Server
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
-- 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