Site Search:
Sign in | Join | Help

SQL Server (T-SQL)

Comments and notes on SQL Server 2000, 2005, and T-SQL

Combined INSERT, UPDATE and SELECT statements

-- =============================================
-- Create scalar function (FN)
-- =============================================
IF EXISTS (SELECT * 
    FROM   sysobjects 
    WHERE  name = N'f_4P_columnType')
 DROP FUNCTION f_4P_columnType
GO


 


CREATE FUNCTION f_4P_columnType 
 (@intColumnType as int,@intLength int, @intPrecision int , @intscale int)


 


-- select dbo.f_4P_columnType(56,0,0,0)


 


RETURNS varchar(20)


 


AS
BEGIN
declare @out varchar(20)


 


select @out = 
 case when @intColumnType = 56 then 'int'
  when @intColumnType = 48 then 'tinyint'
  when @intColumnType = 36 then 'uniqueidentifier'
  when @intColumnType = 52 then 'smallint'
  when @intColumnType = 60 then 'money'
  when @intColumnType = 45 then 'bit'
  when @intColumnType = 62 then 'float'



  when @intColumnType = 35 then 'text'
  when @intColumnType = 61 then 'datetime'
  when @intColumnType = 189 then 'timestamp'
  when @intColumnType = 239 then 'nvar(' + convert(varchar(4),@intLength) + ')'
  when @intColumnType = 231 then 'nvarchar(' + convert(varchar(4),@intLength) + ')'
  when @intColumnType = 173 then 'binary(' + convert(varchar(4),@intLength) + ')'
  when @intColumnType in (175,47) then 'char(' + convert(varchar(4),@intLength) + ')'
  when @intColumnType = 167 then 'varchar(' + convert(varchar(4),@intLength) + ')'
  when @intColumnType in (108,63) then 'numeric(' + convert(varchar(4),@intPrecision) + ',' + convert(varchar(4),@intscale) + ')'
  when @intColumnType in (106) then 'numeric(' + convert(varchar(4),@intPrecision) + ',' + convert(varchar(4),@intscale) + ')'
  else 'dunno - ' + convert(varchar(4),@intColumnType)
  end 


 


 return @out



 



END
GO
-- =============================================
-- v 1.5 
-- =============================================
IF EXISTS (SELECT * 
    FROM   sysobjects 
    WHERE  name = N'f_4P_columnTypeVB')
 DROP FUNCTION f_4P_columnTypeVB
GO



CREATE FUNCTION f_4P_columnTypeVB 
 (@intColumnType as int)



-- select dbo.f_4P_columnTypeVB(56)



RETURNS varchar(20)



AS
BEGIN
declare @out varchar(20)



select @out = 
 case when @intColumnType in(48,52, 56) then 'system.int64'
  when @intColumnType = 36 then 'GUID'
  when @intColumnType in(108,60,63,106) then 'double'
  when @intColumnType = 45 then 'boolean'
  when @intColumnType in (35,47,167, 175,231) then 'string'
  when @intColumnType = 61 then 'date'
  when @intColumnType = 104 then 'int16' --bit
  --when @intColumnType = 173 then 'binary(' + convert(varchar(4),@intLength) + ')'
  else 'dunno - ' + convert(varchar(4),@intColumnType)
  end 



 return @out


 


END
GO
-- =============================================
-- 
-- =============================================
-- 1/1/1900 created
IF EXISTS (SELECT name 
    FROM   sysobjects 
    WHERE  name = N'sp_select' 
    AND    type = 'P')
    DROP PROCEDURE sp_select
GO



CREATE PROCEDURE sp_select 
-- sp_select 'groups'



@vchrTableName varchar(50)


 


AS



set nocount on
 
declare @vchrProcName varchar(100)
declare @vchrFieldName varchar(100)
declare @vchrFieldType varchar(100)
declare @vchrFieldTypeVB varchar(100)
declare @vchrParamName varchar(100)
declare @intColstat int
declare @vchrParamList varchar(1000)
declare @vchrSelectList varchar(1000)



select
 @vchrParamList = '',
 @vchrSelectList = '',
-- @vchrParamListVB = '',
-- @vchrParamListHelper = '',
-- @output = '',
 @vchrProcName = '_4P_' + upper(@vchrTableName) + '_SEL',
 @vchrTableName = upper(@vchrTableName)


 


print 'IF EXISTS (SELECT name '
print '    FROM   sysobjects '
print '    WHERE  name = N' + char(39) + @vchrTableName + char(39)
print '        AND type = ' + char(39) + 'P' + char(39) + ')'
print '    DROP PROCEDURE ' + @vchrProcName
print 'GO'
PRINT ''
print 'CREATE PROCEDURE ' + @vchrProcName
print ''



declare curFields CURSOR for
select syscolumns.name,
  dbo.f_4P_columnType (xusertype,length, xprec , xscale),
  dbo.f_4P_columnTypeVB (xusertype),
  char(64) + syscolumns.name,
  syscolumns.colstat
 from sysobjects
  left join syscolumns on syscolumns.id = sysobjects.id
 where sysobjects.name = @vchrTableName



-- sp_select 'groups'



DECLARE @vchrWhere varchar(1000)
set @vchrWhere = ''



OPEN curFields
FETCH NEXT FROM curFields INTO @vchrfieldName, @vchrFieldType, @vchrFieldTypeVB,@vchrparamName, @intColstat
WHILE @@FETCH_STATUS = 0
BEGIN
 --build a where clause
 if @intColStat = 1 begin
  set @vchrWhere = @vchrWhere  + '        ' + @vchrFieldName + ' = ' + @vchrparamName+ char(13)
  
  --build a param list (builds @name varchar(20) )
  set @vchrParamList = @vchrParamList + char(13) + @vchrparamName + ' ' + @vchrFieldType + ','
 end



 --build the 'set' list
 set @vchrSelectList = @vchrSelectList + char(13)  + space(8) + @vchrFieldName + ','



 FETCH NEXT FROM curFields INTO @vchrfieldName, @vchrFieldType,@vchrFieldTypeVB, @vchrparamName, @intColstat


 


END
CLOSE curFields
DEALLOCATE curFields



--remove the last char from the list
set @vchrParamList = left(@vchrParamList, len(@vchrParamList)-1)



--remove the first and last char from the list
set @vchrSelectList = stuff(@vchrSelectList,1,1,'')
set @vchrSelectList = left(@vchrSelectList, len(@vchrSelectList)-1)



print @vchrParamList
print ''
PRINT 'AS'
print ''
Print 'SELECT'
print @vchrSelectList
print '    FROM ' + @vchrTableName + ' WITH (NOLOCK)'



print '    WHERE'
print @vchrWhere
PRINT 'GO'
PRINT 'GRANT EXEC ON ' + @vchrProcName + ' TO PUBLIC'
-- sp_select 'groups'



go



grant exec on sp_select to public


go 
-- =============================================
-- 
-- =============================================
-- 1/1/1900 created
IF EXISTS (SELECT name 
    FROM   sysobjects 
    WHERE  name = N'sp_insert' 
    AND    type = 'P')
    DROP PROCEDURE sp_insert
GO


CREATE PROCEDURE sp_insert 
--  sp_insert 'sop10101'


@vchrTableName varchar(50)



AS


 


declare @fieldName varchar(500)
declare @paramName varchar(255)
declare @fieldType varchar(50)
declare @fieldTypeVB varchar(50)
declare @intTableNameLen int
declare @vchrProcName varchar(50)
declare @vchrAlias varchar(2)
declare @vchrFieldList as varchar(8000)
declare @vchrFieldList2 as varchar(8000)
Declare @vchrParamList as varchar(8000)
Declare @vchrIntoList as varchar(8000)
declare @paramListHelper varchar(8000)
declare @paramListVB varchar(8000)



select @vchrTableName = upper(@vchrTableName)


select
    @vchrProcName = 'FP_' + @vchrTableName + '_INS',
    @vchrAlias = case when left(@vchrTableName,1) = '_' then substring(@vchrTableName,2,1) else left(@vchrTableName,1) end + '.',
    @intTableNameLen = len(@vchrTableName),
    @vchrFieldList = '',
    @vchrFieldList2 = '',
    @vchrParamList = '',
    @vchrIntoList = '',
    @paramListVB = '',
    @paramListVB = '',
    @paramListHelper = ''
    


select
    @vchrProcName = replace(@vchrProcName,'__','_')


print '-- ============================================='
print '-- '
print '-- ============================================='
print '-- 1/1/1900 created'
print 'IF EXISTS (SELECT name' 
print '    FROM   sysobjects '
print '    WHERE  name = N' + '''' + @vchrProcName + ''''
print '    AND    type = ''P'') '
print '    DROP PROCEDURE ' +  @vchrProcName 
print 'GO'
print 'CREATE PROCEDURE ' + @vchrProcName 
print ''


 


declare curFields CURSOR for
select syscolumns.name,
        dbo.f_4P_columnType(xusertype,length,xprec,xscale) as fieldType,
        dbo.f_4P_columnTypeVB (xusertype),
        char(64) + syscolumns.name
    from sysobjects
        left join syscolumns on syscolumns.id = sysobjects.id
    where sysobjects.name = @vchrTableName
        and colstat <> 1



OPEN curFields



FETCH NEXT FROM curFields INTO @fieldName, @fieldType, @fieldTypeVB, @paramName
WHILE @@FETCH_STATUS = 0
BEGIN
    if @fieldType <> 'text' begin
        set @vchrFieldList = @vchrFieldList + @fieldName + '  '  + ', '
        set @vchrFieldList2 = @vchrFieldList2 + @vchrAlias + @fieldName + ', '
        set @vchrParamList = @vchrParamList + char(64) + @fieldName + ' ' + @fieldtype + ',' + char(13) + char(10)
        set @vchrIntoList = @vchrIntoList + char(64) + @fieldName + ' , '


        --build a VB param list
        set @paramListVB = @paramListVB + ', ' + 'ByVal ' + @fieldName + ' As ' + @fieldTypeVB  
    
        --build a sqlhelper param list
        set @paramListHelper = @paramListHelper + ', _ ' + char(13) + space(16) + 'New SqlParameter("' + @paramName + '", ' + @fieldName + ')'
    end
    FETCH NEXT FROM curFields INTO @fieldName, @fieldType,@fieldTypeVB, @paramName
END
CLOSE curFields
DEALLOCATE curFields



set @vchrFieldList = left(@vchrFieldList, len(@vchrFieldList) - 1)
set @vchrFieldList2 = left(@vchrFieldList2, len(@vchrFieldList2) - 1)
set @vchrParamList = left (@vchrParamList,len(@vchrParamList)-3)
set @vchrIntoList = left (@vchrIntoList,len(@vchrIntoList)-1)
set @paramListVB = stuff(@paramListVB,1,1,'')
--  sp_insert 'XPOTrans_HIST'



print @vchrParamList
print ''
print 'AS'
PRINT ''
 
print  'INSERT INTO ' + @vchrTableName + ' (' + @vchrFieldList + ')'
print  '    SELECT    ' + space(@intTableNameLen) + @vchrFieldList2 
print  '        FROM '



PRINT ''
PRINT ''
print 'INSERT INTO  ' + @vchrTableName + ' (' + @vchrFieldList + ')'
print space(len(@vchrProcName)) + 'values(' + @vchrIntoList + ')'
PRINT ''
PRINT 'GO'
print '' 
print 'grant exec on ' + @vchrProcName + ' to public'
print ''
print 'Public Sub ' + @vchrTableName + '_INS(' + @paramListVB + ') '
print '    SqlHelper.ExecuteNonQuery(m_cs, CommandType.StoredProcedure, "' + @vchrProcName + '"' + @paramListHelper + ' )'
print 'End Sub'



go


 


 


-- =============================================
-- 
-- =============================================
-- 1/1/1900 created
IF EXISTS (SELECT name 
       FROM   sysobjects 
       WHERE  name = N'sp_update' 
       AND    type = 'P')
    DROP PROCEDURE sp_update
GO


CREATE PROCEDURE sp_update 
-- sp_update 'sop10101'


@tablename varchar(50)



AS


set nocount on
    
declare @output varchar(8000)
declare @fieldTypeVB varchar(50)
declare @fieldName varchar(500)
declare @fieldType varchar(50)
declare @paramName varchar(255)
declare @paramList varchar(8000)
declare @paramListVB varchar(8000)
declare @paramListHelper varchar(8000)
declare @vchrProcName varchar(255),
    @vchrSetList varchar(8000),
    @intColStat int


set @output = ''


select
    @paramList = '',
    @vchrSetList = '',
    @paramListVB = '',
    @paramListHelper = '',
    @output = '',
    @vchrProcName = 'FP_' + upper(@tablename) + '_UPD',
    @tableName = upper(@tableName)



print 'IF EXISTS (SELECT name '
print '    FROM   sysobjects '
print '    WHERE  name = N' + char(39) + @tablename + char(39)
print '        AND type = ' + char(39) + 'P' + char(39) + ')'
print '    DROP PROCEDURE ' + @vchrProcName
print 'GO'
print ''
print 'CREATE PROCEDURE ' + @vchrProcName


declare curFields CURSOR for
select syscolumns.name,
        dbo.f_4P_columnType (xusertype,length, xprec , xscale),
        dbo.f_4P_columnTypeVB (xusertype),
        char(64) + syscolumns.name,
        syscolumns.colstat
    from sysobjects
        left join syscolumns on syscolumns.id = sysobjects.id
    where sysobjects.name = @tablename
--      and colstat <> 1



DECLARE @vchrWhere varchar(1000)
set @vchrWhere = ''


OPEN curFields
FETCH NEXT FROM curFields INTO @fieldName, @fieldType, @fieldTypeVB,@paramName, @intColstat
WHILE @@FETCH_STATUS = 0
BEGIN
    --build a where clause
    if @intColStat = 1 begin
        set @vchrWhere = @vchrWhere  + '        ' + @fieldName + ' = ' + @paramName+ char(13)
    end
    --build a param list
    set @paramList = @paramList + char(13) + @paramName + ' ' + @fieldType + ','


    --build the 'set' list
    set @vchrSetList = @vchrSetList + char(13) + space(8) + @fieldName + ' = ' + @paramName + ','



    --build a VB param list
    set @paramListVB = @paramListVB + ', ' + 'ByVal ' + @fieldName + ' As ' + @fieldTypeVB  


    --build a sqlhelper param list
    set @paramListHelper = @paramListHelper + ', _ ' + char(13) + space(16) + 'New SqlParameter("' + @paramName + '", ' + @fieldName + ')'


    FETCH NEXT FROM curFields INTO @fieldName, @fieldType,@fieldTypeVB, @paramName, @intColstat



END
CLOSE curFields
DEALLOCATE curFields


set @paramListVB = stuff(@paramListVB,1,2,'')


--remove the first and last char from the list
set @vchrSetList = stuff(@vchrSetList,1,1,'')
set @vchrSetList = left(@vchrSetList, len(@vchrSetList)-1)


--remove the last char from the list
set @paramList = left(@paramList, len(@paramList)-1)



print @paramlist
print ''
print 'AS'
print ''
print 'UPDATE ' + @tablename + ' SET'
print @vchrSetList


--print '    FROM ' + @tablename 
PRINT '    WHERE '
print @vchrWhere
-- sp_update 'cn20100'


print ''
print 'GO'
print ''
print 'grant all on ' + @vchrProcName + ' to public'
print ''
print ''
print ''
print ''
print 'Public Sub ' + @tableName + '_UPD(' + @paramListVB + ') '
print '    SqlHelper.ExecuteNonQuery(m_cs, CommandType.StoredProcedure, "' + @vchrProcName + '"' + @paramListHelper + ' )'
print 'End Sub'



go


grant all on sp_update to public



 

Comments

No Comments

About Steve Gray

Steve is a seasoned (translate: old) developer in VB and ASP.NET. He spends most of his time in Dynamics GP, writing custom mods for consulting firms. Crystal reports, eConnect, VS Tools for Dynamics... anything that comes along.