簡體   English   中英

將列名作為參數傳遞

[英]Pass Column Name as parameter

我想將PassColumn名稱用作我的SP中的參數,並且如果我的tat列存在於第一個表(Batch_Master)中,則想對該列中的值進行賦值,

如果在我的第二個表(GTIN_Master)存在列,希望從達表列取值,每個表都列如.. Batch_Master(Batch_M_id,GTIN(主鍵),....等GTIN_Master(GTIN(外鍵),..等等)

我有Batch_M_id列名作為參數。

注意:列名稱具有隨機數據類型,某個時間int或某個時間datetime等

我嘗試關注SP

CREATE PROCEDURE dbo.StoredProcedure2

    @columnName varchar(50),
    @batchmId  int
AS

if exists(select * from sys.columns 
            where Name = N'columnName' and Object_ID = Object_ID(NBatch_Master'))    

begin

select @columnName from Batch_Master

end


else

begin

 select @columnName 
     from GTIN_Master inner join Batch_Master
     on GTIN_Master.GTIN = Batch_Master.GTIN
     where Batch_M_id =@batchmId


    end
    RETURN

當您不完全知道要執行的查詢結構時需要什么,那么您必須創建一個動態查詢,這實際上是模板查詢的一種形式。

CREATE PROCEDURE dbo.StoredProcedure2

    @columnName varchar(50),
    @batchmId  int
AS

    DECLARE @SQL1 AS VARCHAR(MAX)
    DECLARE @SQL2 AS VARCHAR(MAX)

    SET @SQL1 = 'select ' + @columnName + ' from Batch_Master'

    SET @SQL1 = 'select ' + @columnName + '
         from GTIN_Master inner join Batch_Master
         on GTIN_Master.GTIN = Batch_Master.GTIN
         where Batch_M_id =' + CONVERT(VARCHAR,@batchmId)

    IF EXISTS(SELECT * FROM sys.columns WHERE Name = @columnName and Object_ID = Object_ID(N'Batch_Master'))
        BEGIN    
            EXEC (@SQL1)
        END
    ELSE
        BEGIN
            EXEC (@SQL2)
        END

上面的代碼可以做您想要的,但是容易出錯。 例如,如果第二個查詢中使用的表中不存在傳入參數的列,該怎么辦? 您可能還需要在第二種情況下檢查是否存在。

DECLARE @SQL VARCHAR(MAX)
SET @SQL = 'select ' + @columnName + ' from Batch_Master'

EXECUTE(@SQL)

此SQL:

set nocount on
go

create table One (id int, name varchar(25))
go
create table Two (id int, value varchar(25))
go

insert into One values (1, 'Table One')
insert into Two values (1, 'Table Two')
go

create procedure sp_test_colname
  @colname sysname
as
  declare @sql nvarchar(2048)

  if exists (select 1 from sys.columns where name = @colname and object_id = object_id(N'One'))
    set @sql = 'select [' + @colname + '] from [One]'
  else
    if exists (select 1 from sys.columns where name = @colname and object_id = object_id(N'Two'))
      set @sql = 'select [' + @colname + '] from [Two]'

  if @sql <> ''
    exec sp_executesql @sql
go

exec sp_test_colname 'name'
exec sp_test_colname 'value'
exec sp_test_colname 'somethingelse'
go

drop procedure sp_test_colname
drop table One, Two

返回以下內容:

name
-------------------------
Table One

value
-------------------------
Table Two

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM