﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » Updates and Information » StrataFrame Users Contributed Samples  » Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Wed, 08 Apr 2026 01:31:16 GMT</lastBuildDate><ttl>20</ttl><item><title>Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost24706.aspx</link><description>Core concept :&lt;BR&gt;You can now pass full tables - in fact anything that implements iEnumerable - into a SQL Server 2008 SProc &lt;BR&gt;THIS IS BIG !&lt;P&gt;Walkthrough :&amp;nbsp; &lt;/P&gt;&lt;P&gt;First, you need to create a user-defined table type.&amp;nbsp; This establishes the schema of the data you will pass in.&amp;nbsp; The datatable you pass in to the parameter that is defined as being of this type must match this schema as well.&lt;/P&gt;&lt;P&gt;In your database, go to the node database/programmability/types/user-defined types and right click for CREATE script&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;[codesnippet]USE [membership]&lt;BR&gt;GO&lt;BR&gt;/****** Object: UserDefinedTableType [dbo].[TVPGuidkeys] Script Date: 09/24/2009 20:10:11 ******/&lt;BR&gt;CREATE TYPE [dbo].[TVPGuidkeys] AS TABLE(&lt;BR&gt;[guidkey] [uniqueidentifier] NOT NULL,&lt;BR&gt;PRIMARY KEY CLUSTERED &lt;BR&gt;(&lt;BR&gt;[guidkey] ASC&lt;BR&gt;)WITH (IGNORE_DUP_KEY = OFF)&lt;BR&gt;)&lt;BR&gt;GO[/codesnippet]&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;Here I am creating the schema for a one column table where guidkey will contain a UID key ( system.guid on the .net side) which will be pks in the Members table&lt;/P&gt;&lt;P&gt;Now a sproc that will get Members matching the pks that are passed in :&lt;/P&gt;&lt;P&gt;[codesnippet]&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/P&gt;&lt;P&gt;USE&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; [membership]&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;&lt;P&gt;/****** Object: StoredProcedure [dbo].[get_Members_by_pklist] Script Date: 09/24/2009 20:23:39 ******/&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;SET&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ANSI_NULLS&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ON&lt;/P&gt;&lt;P&gt;GO&lt;/P&gt;&lt;P&gt;SET&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;QUOTED_IDENTIFIER&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ON&lt;/P&gt;&lt;P&gt;GO&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;&lt;P&gt;-- =============================================&lt;/P&gt;&lt;P&gt;-- Author: Charles Hankey&lt;/P&gt;&lt;P&gt;-- Create date: 09-24-09&lt;/P&gt;&lt;P&gt;-- Description: Pull records from Members based on passed in table of pks&lt;/P&gt;&lt;P&gt;-- =============================================&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;CREATE&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;PROCEDURE&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; [dbo]&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;[get_Members_by_pklist] &lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;-- Add the parameters for the stored procedure here&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;@pklist dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;TVPGuidkeys &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;READONLY&lt;/P&gt;&lt;P&gt;AS&lt;/P&gt;&lt;P&gt;BEGIN&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;-- SET NOCOUNT ON added to prevent extra result sets from&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;-- interfering with SELECT statements.&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;SET&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;NOCOUNT&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&lt;FONT color=#008000 size=2&gt;-- Insert statements for procedure here&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cPK_Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cCompany&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cFirst_Name&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cLast_Name&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cClassCode&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;,&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;P&gt;&lt;FONT size=2&gt;mc&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cClass&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;FROM&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Members &lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;JOIN&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;MembershipClasses mc&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;ON&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cClassCode &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;=&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; mc&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cClassCode&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;WHERE&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; dbo&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;Members&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;cPK_Members &lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;IN&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;(&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;SELECT&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; guidkey &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;FROM&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; @pklist&lt;/FONT&gt;&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;)&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;&lt;P&gt;END&lt;/P&gt;&lt;P&gt;GO&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;[/codesnippet]&lt;/P&gt;&lt;P&gt;Notice : @pklist dbo&lt;FONT color=#808080 size=2&gt;&lt;FONT color=#808080 size=2&gt;.&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;TVPGuidkeys &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;READONLY&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;@pklist can be treated like a table - you could do a left join to it and achieve the same thing here as the sub-query.&amp;nbsp; You could also use it to do an insert if you had structured the param to pass in a set of records !!&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;You cannot change the values of the @pklist&lt;/P&gt;&lt;P&gt;Now here is the .NET side in your SF app :&lt;/P&gt;&lt;P&gt;this is in the MembersBO.&amp;nbsp; I will later create an overload that receives a pklist as List(Of System.integer)&amp;nbsp; That will require another TVPIntKeys in the database if I want to create sprocs to receive integer PKs.&lt;/P&gt;&lt;P&gt;[codesnippet]&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Sub get_Members_by_pklist(byval pklist As List(Of System.Guid))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pktbl As DataTable = New DataTable("pktbl")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim newrow As DataRow&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim colname As DataColumn = New DataColumn("guidkey")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; colname.DataType = System.Type.GetType("System.Guid")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pktbl.Columns.Add(colname)&lt;/P&gt;&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each pk As System.guid In pklist&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow = pktbl.NewRow()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newrow("guidkey")=pk&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pktbl.Rows.Add(newrow)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cmd As SqlCommand = new SqlCommand("dbo.get_members_by_pklist")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.CommandType = commandtype.StoredProcedure&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oparm As SqlParameter = cmd.Parameters.AddWithValue("@pklist",pktbl)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oparm.SqlDbType = sqldbtype.Structured&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oparm.TypeName = "dbo.TVPGuidkeys"&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.FillDataTable(cmd)&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub[/codesnippet]&lt;/P&gt;&lt;P&gt;Under the category of weird things I didn't expect : the ADO stuff -&amp;nbsp;colname.DataType = System.Type.GetType("System.Guid") appears to be case-sensitive. :w00t: At least I was getting design-time errows when I used system.type.getype ...&lt;/P&gt;&lt;P&gt;Now I call the fill method when I come back from a browse dialog (the BD&amp;nbsp;was driven by a SQL view with very denormalized data )&lt;/P&gt;&lt;P&gt;[codesnippet]&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub bdMembers_BrowseDialogClosed(ByVal e As MicroFour.StrataFrame.UI.Windows.Forms.BrowseDialogClosedEventArgs) _&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Handles bdMembers.BrowseDialogClosed&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Me.Members_lookupBO1.Count &amp;gt; 0 Then&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim pks As New System.Collections.Generic.List(Of System.Guid)&lt;/P&gt;&lt;P&gt;&amp;nbsp;'find all the pks of the records selected in the browsedialog&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each bo As Members_lookupbo In Me.Members_lookupBO1.GetEnumerable()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pks.Add(bo.cPK_Members)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;'get all the records for the selected pks using a stored procedure&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.MembersBO1.get_Members_by_pklist(pks)&lt;/P&gt;&lt;P&gt;&amp;nbsp;'this is a listview on the maintenance form &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Me.lvmembers.Requery()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub[/codesnippet]&lt;/P&gt;&lt;P&gt;There it is.&amp;nbsp; FillbyPrimaryKey using a sproc.&amp;nbsp; And the tools to use datatables in all sorts of ways in conjunction with sprocs.&lt;/P&gt;&lt;P&gt;See the thread on this topic in Business Objects for some links to Kevin Goff's Code Magazine articles.&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&amp;nbsp;</description><pubDate>Fri, 12 Nov 2010 08:14:18 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost28956.aspx</link><description>Boy am I glad I wrote this up the first time around!&amp;nbsp; Now I actually really need it and frankly I'm having to read it over multiple times to remember what the heck I did &lt;span&gt;:)&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;In using sprocs for Xtrareports datasets, I'm finding there will be a lot of times when I need to first get the records for the main band, and then get child records for all the records in the first set,&amp;nbsp; In order to do this with 2 sprocs - one for parent and then one for children connected to the selected parent set - I need a way to tell the child sproc which record to pull based on matching fks with a list of parent pks.&amp;nbsp; &lt;br/&gt;&lt;br/&gt;And this is the way to go, unless somebody else has a suggestion ...</description><pubDate>Fri, 12 Nov 2010 08:14:18 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost24742.aspx</link><description>I just took my first leap into Generic methods so don't laugh - I think this is generic.  The goal is to have one sub in my basebo that can handle collections of pks whatever the data type. In my previous post in this topic i have a method that works specifically for guid keys.  Here is that method refactored&lt;br&gt;
&lt;br&gt;
[codesnippet]        Public Sub FillfromSproc_by_pklist(Of T) (byval pklist As List(Of T),Byval sproc As string)&lt;br&gt;
&lt;br&gt;
' I need the name of the TVP defined in that database.  That is a schema that needs to know the name of the&lt;br&gt;
' the pkkey column - renamed from previous guidkey/intkey version &lt;br&gt;
' still have 2 TVPs - could probably get around that by using a single TVP with multiple columns for different &lt;br&gt;
' data types and only using the one appropriate, but for right now it is just as easy to do it this way&lt;br&gt;
&lt;br&gt;
' build the name of the TVP being used to declare the parm @pklist in the sproc       &lt;br&gt;
&lt;br&gt;
        Dim TType As String = gettype(T).Name  &lt;br&gt;
        Dim typestr As String = "dbo.TVP" &amp; TType &amp; "keys"&lt;br&gt;
&lt;br&gt;
' since this is the function that actually builds the datatable it needed to be &lt;br&gt;
' refactored as well, getting its type for the pkkey column - renamed to be type agnostic &lt;br&gt;
' from the type of the pklist that is being passed in - see below&lt;br&gt;
&lt;br&gt;
        Dim pktbl As DataTable = Utility.PKlisttoDatatable(pklist)&lt;br&gt;
        Dim cmd As SqlCommand = new SqlCommand(sproc)&lt;br&gt;
&lt;br&gt;
        cmd.CommandType = commandtype.StoredProcedure&lt;br&gt;
        Dim oparm As SqlParameter = cmd.Parameters.AddWithValue("@pklist",pktbl)&lt;br&gt;
        oparm.SqlDbType = sqldbtype.Structured&lt;br&gt;
&lt;br&gt;
'use the TVP type name built above for the type represented by T&lt;br&gt;
&lt;br&gt;
        oparm.TypeName = typestr&lt;br&gt;
&lt;br&gt;
        Me.FillDataTable(cmd)&lt;br&gt;
&lt;br&gt;
        End Sub[/codesnippet]&lt;br&gt;
&lt;br&gt;
Now the refactor of the function that converts a list(Of T) to a datatable with a single column of type T&lt;br&gt;
&lt;br&gt;
[codesnippet]       Public Shared Function PKListtoDatatable(Of T)(byval pklist As List(Of T)) As DataTable&lt;br&gt;
&lt;br&gt;
            Dim pktbl As DataTable = New DataTable("pktbl")&lt;br&gt;
            Dim newrow As DataRow&lt;br&gt;
&lt;br&gt;
            Dim colname As DataColumn = New DataColumn("pkkey")&lt;br&gt;
&lt;br&gt;
' this made me feel like "Hey baby, now you're cookin' with Generics !"&lt;br&gt;
&lt;br&gt;
           colname.DataType = gettype(T)&lt;br&gt;
            &lt;br&gt;
            pktbl.Columns.Add(colname)&lt;br&gt;
&lt;br&gt;
            For Each pk As T In pklist&lt;br&gt;
                newrow = pktbl.NewRow()&lt;br&gt;
                newrow("pkkey")=pk&lt;br&gt;
                pktbl.Rows.Add(newrow)&lt;br&gt;
            Next&lt;br&gt;
            Return pktbl&lt;br&gt;
&lt;br&gt;
        End Function[/codesnippet]&lt;br&gt;
&lt;br&gt;
This is now part of my BaseBO&lt;br&gt;
&lt;br&gt;
The requirement for the sproc that receives it is that it declares a parm called @pklist of a previously created table type for the correct type of the pklist that will be passed in&lt;br&gt;
&lt;br&gt;
Suggestion for further extension or refactor most welcome&lt;br&gt;
&lt;br&gt;</description><pubDate>Fri, 25 Sep 2009 20:31:30 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost24738.aspx</link><description>This is awesome Charles! Thanks!</description><pubDate>Fri, 25 Sep 2009 14:37:13 GMT</pubDate><dc:creator>Greg McGuffey</dc:creator></item><item><title>RE: Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost24709.aspx</link><description>Hi Charles,&lt;br&gt;
&lt;br&gt;
Thanks for the contribution.  I will have to print it out to parse the whole concept and digest it :D.&lt;br&gt;
&lt;br&gt;
I never used store procedures in my VFP application and suddenly after I learned how to use them in SF I now have 20+ in my current project and loving them. :P</description><pubDate>Thu, 24 Sep 2009 21:40:16 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item><item><title>RE: Table Valued Parameters - Passing a table into a sproc in SQL 2008</title><link>http://forum.strataframe.net/FindPost24707.aspx</link><description>To clarify when i talked about creating an overload :&lt;/P&gt;&lt;P&gt;Now that i have the &lt;FONT size=2&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#010001 size=2&gt;&lt;FONT color=#010001 size=2&gt;get_Members_by_pklist&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;byval&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#010001 size=2&gt;&lt;FONT color=#010001 size=2&gt;pklist&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#010001 size=2&gt;&lt;FONT color=#010001 size=2&gt;List&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;FONT color=#0000ff size=2&gt;Of&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#010001 size=2&gt;&lt;FONT color=#010001 size=2&gt;System&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;FONT color=#010001 size=2&gt;&lt;FONT color=#010001 size=2&gt;Guid&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;))&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;working I will abstract this to my basebo as FillbyPKlist(byval pklist AS List(Of T), byval sproc as string)&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;so that I can pass in a list of whatever type is used for pks and call whatever sproc I have setup to use it.&amp;nbsp; The important thing is that there will only be one TVP definition for each datatype (and they have been added to my Model DB) and any sproc I create that is meant to use this collection to pull (or not pull) records will use the appropriate type for its @pklist&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;&lt;/FONT&gt;</description><pubDate>Thu, 24 Sep 2009 19:58:03 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item></channel></rss>