首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >sql脚本变量默认值

sql脚本变量默认值
EN

Stack Overflow用户
提问于 2010-09-19 18:50:44
回答 5查看 9.2K关注 0票数 13

我有一个脚本文件,例如test.sql。我想在sqlcmd模式下使用:r test.sql从另一个脚本调用它,比方说caller.sql。这很好用,但我想在test.sql中使用脚本变量。当我从caller.sql调用test.sql时,我可以设置脚本变量,一切都很正常。但是,我希望使用脚本值的默认值,以便如果调用者没有设置变量,或者如果我直接(不是从caller.sql)运行test.sql,则脚本变量将默认为设置值。

我尝试过像这样的东西

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

EN

回答 5

Stack Overflow用户

发布于 2011-12-13 06:38:07

有一个有限的解决方法(我只在SS2008R2上测试过它):

简单版本-如果您愿意不使用:on error exit / sqlcmd.exe -b

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
: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),因此不能切换到使用:on error exit进行健壮的错误处理。因此,您必须在脚本的其余部分进行自己的错误处理-这不是微不足道的;请参阅SQL Server - stop or break execution of a SQL script
  • If删除:on error ignore为了使脚本在常规模式下在SSMS中工作,请确保在使用sqlcmd.exe调用该脚本时未指定-b选项,因为如果引用的脚本变量不存在,则会阻止整个脚本运行。
  • 通过将脚本变量有效地转换为常规T-SQL变量,您不能在T-SQL需要文字的位置使用该值,例如CREATE database语句中的数据库名称。
  • 如果未定义脚本变量,则会将以下警告输出到stderr:'variableName‘脚本变量未定义。

健壮的版本-更麻烦,但支持:on error exit,这是明智的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 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当从sqlcmd.exe调用时,以及在常规模式下的SSMS中都可以工作-假设您没有在脚本中使用其他

  • 命令。遗憾的是,SQLCMD模式中的SSMS总是拒绝运行引用了不存在的脚本的脚本,因此需要使用SET CONTEXT_INFO,因为值需要跨批处理边界传递,这不能用T- variable.
  • The变量来完成。要切换回健壮的错误,需要多个批处理。上面的handling.
  • The代码只支持一个脚本变量,并且由于使用了SET CONTEXT_INFO,它的长度被限制为128字节= 64个Unicode字符;不过,也可以使用其他解决方法,例如临时表。
  • 通过有效地将脚本变量转换为常规的T-
  • 变量,您不能在T-SQL需要文字的地方使用该值,例如CREATE DATABASE语句中的数据库名称。
  • 如果未定义脚本变量,则会将以下警告输出到stderr:'variableName‘脚本变量未定义。
票数 6
EN

Stack Overflow用户

发布于 2011-05-03 20:49:45

检索变量并将其赋值给变量,如果该变量未通过SET语句,则将其赋值。catch将处理默认值。这对我来说在SQL Server2005上是有效的。我注意到,当我在SQL Management Studio中运行它时,它总是显示失败,即使我认为它可以工作。当我使用sqlcmd通过命令行运行它时,它可以正常工作,没有任何错误消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BEGIN TRY 
    DECLARE @bogusVar VARCHAR(64);
    SET @bogusVar = '' + $(envVar);
    PRINT 'Using values passed from sqlcmd';
END TRY
BEGIN CATCH
    PRINT 'Using default values for script'
    :setvar envVar 'DefaultValue'
END CATCH;
票数 0
EN

Stack Overflow用户

发布于 2012-06-13 17:07:04

如果您从Windows命令提示符运行SQLCMD,请在SQLCMD语句的末尾添加“SQLCMD”。这将消除输出开始时的SQLCMD投诉。

示例: sqlcmd -S DatabaseServer -E -d MyDatabase -i MyScript -v Variable1=Value1 2> nul

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3747006

复制
相关文章
真正的层次认知模型
second level A matrix (likelihood mapping) mediates the ascending and descending messages between hierarchical levels. This structure also entails that the second-level model must operate at a slower timescale than the first-level model, because each observation in the second-level model (i.e., each time point in a second-level trial) corresponds to the results of (i.e., posterior beliefs after) a complete trial in the first-level model. Thus, there are as many first-level trials as there are time points in a second-level trial.
CreateAMind
2022/11/22
4420
真正的层次认知模型
R语言随机森林模型中具有相关特征的变量重要性
变量重要性图是查看模型中哪些变量有趣的好工具。由于我们通常在随机森林中使用它,因此它看起来非常适合非常大的数据集。大型数据集的问题在于许多特征是“相关的”,在这种情况下,很难比较可变重要性图的值的解释。例如,考虑一个非常简单的线性模型
拓端
2020/08/06
2.1K0
R语言随机森林模型中具有相关特征的变量重要性
变量重要性图是查看模型中哪些变量有趣的好工具。由于我们通常在随机森林中使用它,因此它看起来非常适合非常大的数据集。大型数据集的问题在于许多特征是“相关的”,在这种情况下,很难比较可变重要性图的值的解释。
拓端
2020/09/28
2K0
R语言随机森林模型中具有相关特征的变量重要性
层次模型(树形结构)
在层次模型中,每个结点表示一个记录类型,每个记录类型可包含若干个字段,记录类型描述的是实体,字段描述的是实体的属性。
孙晨c
2019/10/29
2.3K0
本地配置wamp具有多个根目录
今天闲着没事,自己前些日子想把本地的wamp配置成两个根目录。于是就摸索自己配置玩玩。 配置测试环境:wamp2.0 1. 首先将Windows/system32/drivers/etc/hosts文件打开(用记事本打开) 2. 将原来的127.0.0.1 localhost改为 127.0.0.1 localhost 127.0.0.1 nitnews      #(这个你可以自己顺便写) 3. 保存修改后的文件,如果有什么提示就允许即可 4. 启动wamp打开apache配置文件(我的wamp是在D
苦咖啡
2018/05/07
1.2K0
python输出多个变量的值。
有点类似于C语言 print("%s,%d,%d"%(name ,age ,school))
py3study
2020/01/10
5K0
Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
当面对多个模型时,我们有多种选择。模型选择因其简单性而具有吸引力,但我们正在丢弃有关模型中不确定性的信息。
拓端
2023/08/17
3280
贝叶斯深度学习:桥接PyMC3和Lasagne构建层次神经网络
编辑部翻译组 编译:西西、wally 作者:Thomas Wiecki 今天,我们将使用Lasagne构建一个更有趣的模型,这是一个灵活的Theano图书馆,用于构建各种类型的神经网络。你可能知道,PyMC3还使用了Theano,因此在Lasagne中建立了人工神经网络(ANN),将贝叶斯先验放在参数上,然后在PyMC3中使用变分推理(ADVI)来估计模型。 由于Lasagne的优秀表现,我们可以轻松地建立一个具有最大汇集层的分层贝叶斯卷积ANN,在MNIST上实现98%的准确性。 数据集:MNIS
量化投资与机器学习微信公众号
2018/01/29
7540
贝叶斯深度学习:桥接PyMC3和Lasagne构建层次神经网络
stata如何处理结构方程模型(SEM)中具有缺失值的协变量
本周我正和一位朋友讨论如何在结构方程模型(SEM)软件中处理具有缺失值的协变量。我的朋友认为某些包中某些SEM的实现能够使用所谓的“完全信息最大可能性”自动适应协变量中的缺失。在下文中,我将描述我后来探索Stata的sem命令如何处理协变量中的缺失。
拓端
2020/07/17
2.9K0
使用pymc3遇到的问题
PyMC3机器学习库,基于heano, NumPy, SciPy, Pandas, 和 Matplotlib。 安装 pip install pymc3,pip命令可以安装pymc3并安装其依赖库 首次运行报错 这可能是缺少某些依赖库导致的,根据报错信息安装即可 运行出现一长串c代码,或者说c代码被存放在某个目录 解决方案:conda install mingw libpython 提示不能导入pyqt4 解决方案:conda install pyqt=4,如果提示不能安装则进入https://www.l
听城
2018/04/27
1.8K0
oracle declare多个变量_赋值
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171208.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/24
1.6K0
Python用PyMC3实现贝叶斯线性回归模型
在本文中,我们将在贝叶斯框架中引入回归建模,并使用PyMC3 MCMC库进行推理。
拓端
2020/08/20
1.7K0
Python用PyMC3实现贝叶斯线性回归模型
基于隐变量的推荐模型基于隐变量的推荐模型
上一篇介绍了协同过滤,其重点就是在人-物品矩阵上,其中心思想是去对人或者物品进行聚类,从而找到相似人或者相似物品,用群体的智慧为个人进行推荐,但是,这种近邻模型也存在好多问题:
zhuanxu
2018/09/07
1.7K0
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
一种替代方法是执行模型选择,但讨论所有不同的模型以及给定信息准则的计算值。重要的是要将所有这些数字和测试放在我们问题的背景下,以便我们和客户能够更好地了解方法可能存在的局限性和缺点。如果你在学术界,你可以使用这种方法向论文、演示文稿、论文等的讨论部分添加元素。
拓端
2023/08/31
6700
数据分享|Python用PyMC3贝叶斯模型平均BMA:采样、信息准则比较和预测可视化灵长类动物的乳汁成分数据
TensorFlow 加载多个模型的方法
采用 TensorFlow 的时候,有时候我们需要加载的不止是一个模型,那么如何加载多个模型呢?
kbsc13
2019/08/16
2.8K0
三种数据模型---层次模型、网状模型以及关系模型
  其实层次数据模型就是的图形表示就是一个倒立生长的树,由基本数据结构中的树(或者二叉树)的定义可知,每棵树都有且仅有一个根节点,其余的节点都是非根节点。每个节点表示一个记录类型对应与实体的概念,记录类型的各个字段对应实体的各个属性。各个记录类型及其字段都必须记录。
Twcat_tree
2022/11/30
10.5K0
三种数据模型---层次模型、网状模型以及关系模型
有 static 变量的 namespace 被多个 cpp 包含
有如下三个文件 header.h #pragma once namespace NS1 { static int var = 10; } void print_var(); src.cpp #include <stdio.h> #include "header.h" void print_var() { printf("%d\n", NS1::var); } main.cpp #include <stdio.h> #include "header.h" int main() { printf("%
零式的天空
2022/03/25
8760
swal弹窗,sweetalert2具有相同功能的多个swal[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 I’d like to make a condition and call a swal for each one (Sweetalert2). But on
全栈程序员站长
2022/11/17
2.5K0
企业应用架构模式中的层次模型简介
企业对外提供服务,通常借助于软件应用。比如交易零售系统,用来提供购买商品的服务,这里就涉及到交易数据,这些数据会被用户“反复”的产生、查看,而且随着服务时间增长,应用本身也会面临困难
爬蜥
2019/10/08
1.3K0
有 static 变量的 namespace 被多个 cpp 包含
有如下三个文件 header.h #pragma once namespace NS1 { static int var = 10; } void print_var(); src.cpp #include <stdio.h> #include "header.h" void print_var() { printf("%d\n", NS1::var); } main.cpp #include <stdio.h> #include "header.h" int main() { printf("%
mzlogin
2020/04/16
1K0

相似问题

具有交互项的Pymc3层次模型

15

在weibullAFT中建立具有协变量的PyMC3模型?

11

rails:具有多个父级的层次模型

13

PYMC3混合模型:帮助理解多变量模型

12

复制具有层次结构的模型

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文