INSERT using LIST into Stored Procedure

后端 未结 2 1231
不知归路
不知归路 2020-12-18 16:17

I have this stored procedure:

CREATE PROCEDURE [RSLinxMonitoring].[InsertFeatures] 
   @Features nvarchar(50), 
   @TotalLicenses int, 
   @LicensesUsed int,         


        
相关标签:
2条回答
  • 2020-12-18 16:47

    If you are using SQL server 2008 & above, you can use below solution. Declare Table type like :

    CREATE TYPE FeatureServerType AS TABLE 
    (
       [Features] nvarchar(50)
       ,[TotalLicenses] int
       ,[LicensesUsed] int
       ,[Server] nvarchar(50) 
    );
    

    Use it like :

    CREATE PROCEDURE [RSLinxMonitoring].[InsertFeatures] 
       @TabletypeFeatures FeatureServerType READONLY
    AS
       SET NOCOUNT ON;
    
       INSERT INTO [RSLinxMonitoring].[FeatureServer]
            ([Features]
               ,[TotalLicenses]
               ,[LicensesUsed]
            ,[Server])
       SELECT * FROM @TabletypeFeatures 
    
    0 讨论(0)
  • 2020-12-18 16:55

    You should use Table type parameters.

    create a class and Table type in sql server. Names and order should match. Now just convert your list to Table using the following code and pass it as a paremeter to the procedure.

    stored procedure help can be seen here

    http://blog.sqlauthority.com/2008/08/31/sql-server-table-valued-parameters-in-sql-server-2008/

        public static DataTable ToDataTable<T>(this List<T> iList)
        {
            DataTable dataTable = new DataTable();
            PropertyDescriptorCollection propertyDescriptorCollection =
                TypeDescriptor.GetProperties(typeof(T));
            for (int i = 0; i < propertyDescriptorCollection.Count; i++)
            {
                PropertyDescriptor propertyDescriptor = propertyDescriptorCollection[i];
                Type type = propertyDescriptor.PropertyType;
    
                if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
                    type = Nullable.GetUnderlyingType(type);
    
    
                dataTable.Columns.Add(propertyDescriptor.Name, type);
            }
            object[] values = new object[propertyDescriptorCollection.Count];
            foreach (T iListItem in iList)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = propertyDescriptorCollection[i].GetValue(iListItem);
                }
                dataTable.Rows.Add(values);
            }
            return dataTable;
        }
    
    0 讨论(0)
提交回复
热议问题