假设我必须实现一段必须返回表的T-SQL代码.我可以实现一个表值函数或一个返回一组行的存储过程.我该怎么用?
简而言之,我想知道的是:
哪些是函数和存储过程之间的主要区别?使用其中一个时需要考虑哪些因素?
我有这样的观点:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = 2;
Run Code Online (Sandbox Code Playgroud)
我想让它更通用,它意味着将2变为变量.我试过这个:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = @MyVariable;
Run Code Online (Sandbox Code Playgroud)
但MySQL不允许这样做.
我找到了一个丑陋的解决方法:
CREATE FUNCTION GetMyVariable() RETURNS INTEGER DETERMINISTIC NO SQL
BEGIN RETURN @MyVariable; END|
Run Code Online (Sandbox Code Playgroud)
然后观点是:
CREATE VIEW MyView AS
SELECT Column FROM Table WHERE Value = GetMyVariable();
Run Code Online (Sandbox Code Playgroud)
但它看起来很糟糕,而且用法也很糟糕 - 我必须在每次使用视图之前设置@MyVariable.
有没有解决方案,我可以像这样使用:
SELECT Column FROM MyView(2) WHERE (...)
Run Code Online (Sandbox Code Playgroud)
具体情况如下:我有一个表存储有关被拒绝请求的信息:
CREATE TABLE Denial
(
Id INTEGER UNSIGNED AUTO_INCREMENT,
PRIMARY KEY(Id),
DateTime DATETIME NOT NULL,
FeatureId MEDIUMINT …Run Code Online (Sandbox Code Playgroud) 我正在使用WinHost.com来托管我的网站.SQL数据库/成员资格系统在我的本地计算机上运行良好,但上传到服务器时它不起作用.我已经正确地遵循了所有步骤.我已经联系了我的服务支持,但已经超过2周,没有回复.
当我尝试在我的网站上的会员页面上登录或注册新用户时,我一直收到此错误.
Server Error in '/' Application.
--------------------------------------------------------------------------------
Could not find stored procedure 'dbo.aspnet_CheckSchemaVersion'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Could not find stored procedure 'dbo.aspnet_CheckSchemaVersion'.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be …Run Code Online (Sandbox Code Playgroud) 我对SQL Server 2008中的用户定义表类型有疑问.
为了满足ASP.NET应用程序之一的需要,我们在SQL Server 2008上定义了自己的表类型,并将它们用作存储过程中的参数(在ASP.NET应用程序中执行sql命令时,我们将DataTable对象作为存储过程的参数传递看这里的例子)
问题是当我们从ASP.NET运行Sql命令(执行存储过程)时,我们收到一个错误:
对象'ourTableType',数据库'ourDatabase',架构'ourSchema'拒绝EXECUTE权限.
为什么会这样?为什么我们需要为用户定义的表类型设置权限?为什么仅仅对使用它的存储过程设置权限是不够的?如果我们要设置它,不管是什么,为什么没有EXECUTE权限类型在属性窗口中任何设置(我只看到Control,References,Take Ownership,View Definition)?
我还不明白的是,Control在属性窗口中设置权限可以解决问题,并且存储过程可以顺利运行.
asp.net security stored-procedures user-defined-types sql-server-2008
我需要声明12个十进制变量,对应于每个月的年份,用光标我将这些变量的值加起来,然后我更新一些销售信息.
我不知道sql server是否有这种语法
Declare MonthsSale(1 to 12) as decimal(18,2)
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常.!
CREATE PROCEDURE [dbo].[proc_test]
AS
BEGIN
--SET NOCOUNT ON;
DECLARE @monthsales TABLE ( monthnr int, amount decimal(18,2) )
-- PUT YOUR OWN CODE HERE
-- THIS IS TEST CODE
-- 1 REPRESENTS JANUARY, ...
INSERT @monthsales (monthnr, amount) VALUES (1, 100)
INSERT @monthsales (monthnr, amount) VALUES (1, 100)
INSERT @monthsales (monthnr, amount) VALUES (2, 200)
INSERT @monthsales (monthnr, amount) VALUES (3, 300)
INSERT @monthsales (monthnr, amount) VALUES (4, 400)
INSERT @monthsales …Run Code Online (Sandbox Code Playgroud) 定义说:
当SET ANSI_NULLS为ON时,即使column_name中存在空值,使用WHERE column_name = NULL的SELECT语句也会返回零行.使用WHERE column_name <> NULL的SELECT语句返回零行,即使column_name中存在非空值也是如此.
这是否意味着此查询中不包含空值?
SELECT Region
FROM employees
WHERE Region = @region
Run Code Online (Sandbox Code Playgroud)
或者ANSI_NULL只关注像这样的查询(其中WHERE包含特定的单词NULL)?
SELECT Region
FROM employees
WHERE Region = NULL
Run Code Online (Sandbox Code Playgroud) 我有一个表管理员,只有一列,adminId是主键.由于业务规则,它必须是这样的.
我想一劳永逸地理解如何编写在这样的表中插入值的存储过程.我正在使用SQL Server和T-SQL并尝试使用SCOPE_IDENTITY(),但这不起作用,因为该表具有INSERT_IDENTITY为false或off.
我真的不想插入一个虚拟值只是为了能够插入一个新行.谢谢!
我正在尝试运行具有多个输入和输出参数的存储过程.只能通过导航其他用户|在我的"连接"面板中查看该过程 | 包裹| |
如果我右键单击,则菜单项为"Order Members By ..."和"Create Unit Test"(灰色显示).当用户访问过程时,似乎无法"运行"该过程.
我一直试图找到一个如何创建匿名块的示例,以便我可以将该过程作为SQL文件运行,但是没有找到任何有效的方法.
有谁知道如何从SQL Developer执行此过程?我使用的是版本2.1.1.64.
提前致谢!
编辑1:
我要调用的程序有这个签名:
user.package.procedure(
p_1 IN NUMBER,
p_2 IN NUMBER,
p_3 OUT VARCHAR2,
p_4 OUT VARCHAR2,
p_5 OUT VARCHAR2,
p_6 OUT NUMBER)
Run Code Online (Sandbox Code Playgroud)
如果我写这样的匿名块:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed
Run Code Online (Sandbox Code Playgroud)
我已经尝试初始化out*变量:
out1 VARCHAR2(100) := '';
Run Code Online (Sandbox Code Playgroud)
但得到同样的错误:
编辑2:
根据Alex的回答,我尝试从params前面移除冒号并得到:
Error starting at line 1 in command:
DECLARE …Run Code Online (Sandbox Code Playgroud) 如何在SQL Server的存储过程中转义字符串,以便在LIKE表达式中使用它是安全的.
假设我有一个NVARCHAR像这样的变量:
declare @myString NVARCHAR(100);
Run Code Online (Sandbox Code Playgroud)
我想在LIKE表达式中使用它:
... WHERE ... LIKE '%' + @myString + '%';
Run Code Online (Sandbox Code Playgroud)
如何在T-SQL中转义字符串(更具体地说,对LIKE模式匹配有意义的字符,例如%或?),以便以这种方式使用它是安全的?
例如,给定:
@myString = 'aa%bb'
Run Code Online (Sandbox Code Playgroud)
我想要:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
Run Code Online (Sandbox Code Playgroud)
匹配'aa%bb','caa%bbc'但不是'aaxbb'或'caaxbb'.
我需要将一个"id"的数组传递给一个存储过程,删除表中的所有行,除了与数组中的id匹配的行.
我怎么能以最简单的方式做到这一点?