Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从变量运行查询时如何在SQL中表示中间语句

从变量运行查询时如何在SQL中表示中间语句
EN

Stack Overflow用户
提问于 2015-09-03 02:51:28
回答 4查看 70关注 0票数 0

我使用@SQL变量构建了一个相当大的语句,然后从语句末尾的变量运行查询。除了将日期插入其中一个参数外,此操作很好。

然后查询不返回数据,并返回一个错误:

从字符串转换日期和/或时间时,转换失败。

我目前拥有的SQL如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALTER PROCEDURE [dbo].[GetVisitListFiltered]
    @sitekey int,
    @VisitNo int = NULL,
    @DNS varchar(max) = NULL,
    @SessionStarted varchar(15) = '01/01/1900',
    @Page varchar(max) = NULL,
    @SecondsOnSite int = NULL,
    @SecondsOnSiteRange int = NULL,
    @Pages int = NULL,
    @Cost int = NULL,
    @City varchar(max) = NULL,
    @Country varchar(max) = NULL,
    @Keywords varchar(max) = NULL,
    @Referrer varchar(max) = NULL
AS
BEGIN
BEGIN TRY
        SET @SecondsOnSiteRange = 
        CASE @SecondsOnSiteRange 
        WHEN 1 THEN '='
        WHEN 2 THEN '>'
        WHEN 3 THEN '<'
        ELSE NULL
        END

        DECLARE @SQL NVARCHAR(MAX)
            , @SQLParams NVARCHAR(MAX);

        SET @SQL = N'
            SELECT VKey,
                  VisitIP,
                  SiteKey,
                  Alert,
                  AlertNo,
                  VisitNo,
                  Invited,
                  Chatted,
                  Prospect,
                  Customer,
                  HackRaised,
                  Spider,
                  Cost,
                  Revenue,
                  Visits,
                  FirstDate,
                  TotalCost,
                  TotalRevenue,
                  OperatingSystem,
                  Browser,
                  SearchEngine,
                  Referrer,
                  Keywords,
                  ReferrerQuery,
                  Name,
                  Email,
                  Company,
                  Telephone,
                  Fax,
                  Street,
                  City,
                  Zip,
                  Country,
                  Web,
                  Organization,
                  CRMID,
                  Notes,
                  DNS,
                  Region,
                  FirstAlert,
                  FirstVisitReferrer,
                  ProspectTypes,
                  VisitDate,
                  SecondsOnSite,
                  Page
            FROM dbo.VisitDetail
            WHERE SiteKey = @p0';

        IF NULLIF(@VisitNo, '') IS NOT NULL                                                                   SET @SQL += N' AND VisitNo = @p1';
        IF NULLIF(@DNS, '') IS NOT NULL                                                                       SET @SQL += N' AND DNS = @p2';
        IF NULLIF(@SessionStarted, '01/01/1900') IS NOT NULL                                                  SET @SQL += N' AND VisitDate between @p3 and @p3 23:59:59';
        IF NULLIF(@Page, '') IS NOT NULL                                                                      SET @SQL += N' AND Page = @p4';
        IF NULLIF(@SecondsOnSite, '') IS NOT NULL AND NULLIF(@SecondsOnSiteRange, '') IS NOT NULL             SET @SQL += N' AND SecondsOnSite' + '@p12' + '@p5';
        IF NULLIF(@Pages, '') IS NOT NULL                                                                     SET @SQL += N' AND PagesSeen = @p6';
        IF NULLIF(@Cost, '') IS NOT NULL                                                                      SET @SQL += N' AND Cost = @p7';
        IF NULLIF(@City, '') IS NOT NULL                                                                      SET @SQL += N' AND City = @p8';
        IF NULLIF(@Country, '') IS NOT NULL                                                                   SET @SQL += N' AND Country = @p9';
        IF NULLIF(@Keywords, '') IS NOT NULL                                                                  SET @SQL += N' AND Keywords = @p10';
        IF NULLIF(@Referrer, '') IS NOT NULL                                                                  SET @SQL += N' AND ReferrerQuery = @p11';

        SET @SQLParams = N'
              @p0 INT
            , @p1 INT
            , @p2 VARCHAR(MAX)
            , @p3 VARCHAR(15)
            , @p4 VARCHAR(MAX)
            , @p5 INT
            , @p6 INT
            , @p7 INT
            , @p8 VARCHAR(MAX)
            , @p9 VARCHAR(MAX)
            , @p10 VARCHAR(MAX)
            , @p11 VARCHAR(MAX)
            , @p12 VARCHAR(10)';


        EXECUTE sp_executesql @SQL
            , @SQLParams
            , @p0 = @SiteKey
            , @p1 = @VisitNo
            , @p2 = @DNS
            , @p3 = @SessionStarted
            , @p4 = @Page
            , @p5 = @SecondsOnSite
            , @p6 = @Pages
            , @p7 = @Cost
            , @p8 = @City
            , @p9 = @Country
            , @p10 = @Keywords
            , @p11 = @Referrer
            , @p12 = @SecondsOnSiteRange;


    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE();
    END CATCH
END

我知道问题就在这方面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IF NULLIF(@SessionStarted, '01/01/1900') IS NOT NULL 
SET @SQL += N' AND VisitDate between @p3 and @p3 23:59:59';

但我不知道怎么解决--有人能建议我做错了什么吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-03 03:13:24

已经有人指出,当@SessionStarted应该是一个日期时,它是一个VARCHAR。并且您的最终SQL格式不正确,其有效性不亚于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @p3 DATE = GETDATE();
SELECT Test = @p3 '23:59:59';

这意味着:

Msg 102,15级,状态1,第3行 在“23:59:59”附近不正确的语法。

但我想强调另一点:

不使用像这样的

您正在尝试构造如下语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WHERE Date BETWEEN '2015-09-03'  AND '2015-09-03 23:59:59'

但是,如果Date是'2015-09-03 23:59:59.5‘-你真的想把这个排除在外吗?最佳做法是使用一个开放的范围:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
WHERE Date >= '2015-09-03'
AND Date < '2015-09-04'

差不多一样,但涵盖了一整天,而不仅仅是大部分时间。所以你的确切陈述应该是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IF NULLIF(@SessionStarted, '01/01/1900') IS NOT NULL 
    SET @SQL += N' AND VisitDate >= @p3 AND VisitDate < DATEADD(DAY, 1, @p3)';

亚伦·伯特兰( Aaron Bertrand )在这方面写了一篇伟大的文章,以供进一步阅读。

因此,总而言之,部分修复将是使用串联运算符+

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @p3 VARCHAR(50) = '03/09/2015';
SELECT Test = @p3 + ' 23:59:59';

更好的解决办法是转换为正确的数据类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @p3 VARCHAR(50) = '03/09/2015';
SELECT Test = CONVERT(DATETIME, @p3 + ' 23:59:59');

更好的做法是使用区域性不变的日期格式,因此很清楚您指的是9月3日还是3月9日:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @p3 VARCHAR(50) = '20150903';
SELECT Test = CONVERT(DATETIME, @p3 + ' 23:59:59');

更好的做法是首先使用正确的数据类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @p3 DATETIME = '20150903';
SELECT Test = @p3 + '23:59:59';

更好的做法是,如上文所述,使用一个开放日期范围。

票数 3
EN

Stack Overflow用户

发布于 2015-09-03 02:57:01

您已经声明sessionstarted是一个字符,而不是日期。我想这是你问题的根源。

将类型更改为日期。我还建议您对日期使用ISO标准YYYY DD格式,而不是使用特定于区域性的格式。

票数 1
EN

Stack Overflow用户

发布于 2015-09-03 02:58:04

你的问题在于这一点@p3 23:59:59';

您正在尝试将字符串值连接到日期。您需要做的是在@p3中添加一个日期(DATEADD),并将其用作另一个参数。

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

https://stackoverflow.com/questions/32373608

复制
相关文章
sql查询语句
select sal*12 as "年工资" , age 年龄,name username from 表名;
HUC思梦
2020/09/03
2.9K0
JAVA中SQL查询语句大全,select多表查询,各种查询
– 查询emp表中的所有部门, 剔除重复的记录, 提示: distinct用于剔除重复值
全栈程序员站长
2022/09/02
2.2K0
JAVA中SQL查询语句大全,select多表查询,各种查询
SQL基本查询语句
SELECT是SQL关键字,SQL关键字是不区分大小写的,但是表名是区分大小写的。SELECT关键字表示查询操作,而*表示查询所有字段。FROM是SQL关键字,表示从哪张表查询。tablename是表名。分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句。另外MySQL要求每条SQL语句的结束都需要加上分号。
zy010101
2020/12/08
1.3K0
SQL 的查询语句
说到查询,我们要回答两个问题:1.查询什么?2.从哪查询?我们可以使用 SQL 的 SELECT 子句来表达要查询什么。使用 FROM 子句来表达从哪查询。
芯动大师
2022/11/15
2.8K0
SQL 的查询语句
sql镶嵌查询_标准SQL嵌套查询语句[通俗易懂]
1、简单子查询62616964757a686964616fe78988e69d8331333433626530
全栈程序员站长
2022/09/22
2.5K0
如何在python文件中测试sql语句
在manage.py的同级目录下新建一个run.py import os if __name__ == '__main__': #加载Django项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE","myblog.settings") #导入Django,并启动Django项目 import django django.setup()  #导入相应的models from person import models  #测试s
西西嘛呦
2020/08/26
1.8K0
SQL复杂查询语句
 进行多表连接查询,掌握多表连接查询的连接条件或连接谓词,理解内连接、左连接和右连接的含义并熟练操作。
慕白
2018/08/02
1.8K0
SQL复杂查询语句
如何在 Linux 上用 SQL 语句来查询 Apache 日志
Linux 有一个显著的特点,在正常情况下,你可以通过日志分析系统日志来了解你的系统中发生了什么,或正在发生什么。的确,系统日志是系统管理员在解决系统和应用问题时最需要的第一手资源。我们将在这篇文章中着重讲解 Apache HTTP web server 生成的 Apache access 日志。
星哥玩云
2022/07/03
1.3K0
如何在 Linux 上用 SQL 语句来查询 Apache 日志
如何在 PHP 中运行 bind_param() 语句?
在PHP中,bind_param()函数是一种准备SQL语句并绑定参数的方法。它通常与预处理语句(prepared statements)一起使用,用于执行数据库操作。bind_param()函数可防止SQL注入攻击,并帮助提高代码的安全性。
七辰
2023/10/04
1.5K0
sql语句日期_sql中字符串和变量拼接
转载于:https://www.cnblogs.com/hoge66/p/11198213.html
全栈程序员站长
2022/11/09
1.2K0
sql语句的各种模糊查询语句
1、%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
全栈程序员站长
2022/08/27
1.7K0
SQL基本查询语句(三)
多表查询的结果是表的乘积,不是显示多个表。这个非常不好用,因为很容易就导致表很大。下面是个例子。
zy010101
2021/05/18
6390
SQL基本查询语句(三)
SQL模糊查询语句(like)
确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可 使用字符串的任意片段匹配通配符。与使用 = 和 != 字符串比较运算符相比,使用通配符可使 LIKE 运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft SQL Server 会将其转换成字符串数据类型(如果可能)。
全栈程序员站长
2022/09/01
2.8K0
SQL基本查询语句(二)
无论是基础查询还是条件查询,最终的结果都是显示了所有字段。即:包含了id, class_id, name, gender, score。如果我们只关心name字段,那么查询语句应该按照如下格式:
zy010101
2020/12/25
7190
sql sever基本查询语句
查询(*可代表全部)(<>代表不等于于) select 列名 from 表名(,隔开) where 查询条件 order by 排序的列名 +连接的数据类型必须兼容(结果为字符串数据的连接 , 如果连接数值型,结果为数值的和) 含有别名的简单查询   : 列名  as 别名 列名  别名 别名=列名 查询空值 select 列名 form 表名 where 列名 is (not)null 查询常量列 常量 as 别名 限制固定行 top 所需行 top 数字 percent(百分比) (紧放在sels
房上的猫
2018/03/14
1.7K0
T-SQL查询语句
1、SQL的组成: ①DML:数据操纵语句 select、insert、delete、update ②DDL:数据定义语句 create、alter、drop ③DCL:数据控制语句 grant、revoke 2、查询语句:select select 列名1,列名2,…… [into 新表名称] from 表名 [where 条件表达式] [order by 列名 排序方式] 排序 [group by 表达式] 分
L宝宝聊IT
2018/06/20
9650
如何查找MySQL中查询慢的SQL语句
如何查找MySQL中查询慢的SQL语句
Java架构师必看
2021/09/18
5.9K0
mysql的sql分页查询语句怎么写_sql 分页查询语句(mysql分页语句)「建议收藏」
intpageCount=15(每页显示的行数)intTotalCount=30(页数*每页显示的行数),这里是第二页stringsearchString=xxxxxx(搜索条件)selecttoppageCount*from表名whereidnotin(selecttopTotalCountidfrom表名wheresearchString)wheresearchStringorderbytimedesc然后下个aspnetpage的分页控件就行了,以上是分页的SQL语句..
全栈程序员站长
2022/07/29
13.6K0
mysql的sql分页查询语句怎么写_sql 分页查询语句(mysql分页语句)「建议收藏」
hql查询语句用法详解_sql add语句
HQL的语法比较简单,与普通SQL的区别之处是针对对象的不同,在查询语句中将sql中的表名替换成了sql中的持久化类名,因为hibernate机制是基于对象进行查询的。
全栈程序员站长
2022/11/11
9790
sql数据库查询语句大全_sql基本语句大全
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/05
2.1K0

相似问题

如何在Python中验证SQL查询,如DDL语句?

189

如何使用sql server中间的通配符(如查询)

11

SQL Select语句(如IN )

31

如何在python中的查询中运行多个SQL语句?

11

在SQL查询中运行XMLA语句?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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