sql-server – sql脚本变量的默认值
我有一个脚本文件,例如TEST.SQL.我想用另一个脚本来调用它,比如caller.sql,在sqlcmd模式下使用:r test.sql.这工作正常,但我想在test.sql中使用脚本变量.当我从caller.sql调用test.sql时,我可以设置脚本变量,一切都很好.但是,我想使用脚本值的默认值,以便如果调用者没有设置变量,或者我直接运行test.sql(而不是从caller.sql),那么脚本变量默认为设置值.
我尝试过诸如此类的东西 begin try select '$(grip)' select 'grip value was found' end try begin catch select 'grip value was missing' end catch 但我得到以下消息: 我在test.sql中需要什么才能处理调用者传递的“grip”?我正在使用MS SQL 2005 解决方法有一个有限的解决方法(我只在SS2008R2上测试过):SIMPLE版本 – 如果你愿意没有:错误退出/ sqlcmd.exe -b: :on error ignore -- Ensures that sqlcmd.exe will not fail when referencing an undefined scripting variable. Remove this if you want your script to work in SSMS in regular mode,too. Declare @valueOrDefault as nvarchar(max)= N'$(value)'; if @valueOrDefault = N'$' + N'(value)' set @valueOrDefault = N'default value'; -- Test if there is a value and,if not,assign a default; note the splitting of the reference string to avoid expansion. -- use @valueOrDefault from now on 注意: >由于T-SQL变量不能跨批处理工作,因此无法启动另一个批处理(使用GO),因此无法在错误退出时切换到强大的错误处理. ROBUST版本 – 更麻烦,但支持:在错误退出时,这是可取的: -- Store the default value in the context info (session-level storage accessible across batches that holds up to 128 bytes). declare @binDefaultValue varbinary(128)= CAST(N'default value' AS varbinary(128)); set CONTEXT_INFO @binDefaultValue; go -- Make the set CONTEXT_INFO statement take effect. -- If the scripting variable has a value,store ITS value in the context info instead. :on error ignore -- Temporarily ignore errors so that accessing a non-existent scripting variable doesn't abort the entire script. declare @value as nvarchar(max) = N'$(value)'; -- Try to access the scripting variable; thanks to :on error ignore this will only give a warning. if @value <> N'$' + N'(value)' -- Test if there is a value; note the splitting of the reference string to avoid expansion. begin -- We have a scripting-variable value: Store it in the context info (replacing the default value). declare @binValue as varbinary(128) = cast(@value as varbinary(128)); set CONTEXT_INFO @binValue; end go -- End batch here,so we can switch back to :on error exit (requires a new batch). :on error exit -- New batch: switch back to robust error handling. -- End the batch here,so that SSMS in *regular* mode - which will fail on the line above - continues processing below. -- Note that when run by sqlcmd.exe the subsequent batches will inherit :on error exit. go -- Retrieve the value or default value from the context info... declare @valueOrDefault as nvarchar(max) = convert(nvarchar(max),CONTEXT_INFO(),0); -- ... and remove trailing null characters. ?? Is there an easier way to do this? declare @pos as int = 0; while @pos < LEN(@valueOrDefault) begin set @pos=@pos+1 if UNICODE(substring(@valueOrDefault,@pos,1)) = 0 break; end if @pos > 0 set @valueOrDefault = left(@valueOrDefault,@pos - 1); -- @valueOrDefault now contains the scripting-variable value or default value. print 'Value or default value: [' + @valueOrDefault + ']'; 注意: >以上工作在从sqlcmd.exe调用时和SSMS中以常规模式调用 – 假设您在脚本中不使用其他SQLCMD命令.遗憾的是,SQLCMD模式下的SSMS始终拒绝运行引用不存在的脚本变量的脚本.>需要使用SET CONTEXT_INFO,因为需要跨批处理边界传递值,这是使用T-SQL变量无法完成的.需要多个批次才能切换回强大的错误处理.>上面的代码仅支持单个脚本变量,并且由于使用SET CONTEXT_INFO,其长度限制为128个字节= 64个Unicode字符;但是,可以想象使用其他解决方法,例如临时表.>通过有效地将脚本变量转换为常规T-SQL变量,例如CREATE DATABASE语句中的数据库名称.>如果未定义脚本变量,则会向stderr打印以下警告:‘variableName’脚本变量未定义. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |