akjarjash 发表于 2020-12-2 15:31

SQL Server 数据库 T-SQL 存储过程中如何将两个 nvarchar 值相加的问题?

SQL :
-- 指定所要使用的数据库
USE master
GO

-- 判断数据库是否存在
IF (EXISTS(SELECT * FROM sys.databases WHERE name = 'MyDB'))
BEGIN
        PRINT '数据库已存在将删除......'
        DROP DATABASE MyDB
END
GO

-- 创建数据库
CREATE DATABASE MyDB
ON PRIMARY
(
        NAME = 'MyDB_DATA',
        FILENAME = 'D:\MyDB_DATA.mdf',
        SIZE = 5MB,
        FILEGROWTH = 10%
)
LOG ON
(
        NAME= 'MyDB_LOG',
        FILENAME = 'D:\MyDB_LOG.ldf',
        SIZE = 1MB,
        FILEGROWTH = 10%
)
GO

-- 指定当前要使用的数据库
USE MyDB
GO

-- 判断数据表是否存在
IF (EXISTS(SELECT * FROM sys.objects WHERE name = 'T_Class'))
BEGIN
        PRINT '数据表已经存在将删除......'
        DROP TABLE T_Student
END
GO

-- 创建数据表
CREATE TABLE T_Class
(
        Id INT PRIMARY KEY IDENTITY(1,1),
        Name NVARCHAR(50) NOT NULL,
)
GO

-- 判断数据表是否存在
IF (EXISTS(SELECT * FROM sys.objects WHERE name = 'T_Student'))
BEGIN
        PRINT '数据表已经存在将删除......'
        DROP TABLE T_Student
END
GO

-- 创建数据表
CREATE TABLE T_Student
(
        Id INT PRIMARY KEY IDENTITY(1,1),
        Name NVARCHAR(50) NOT NULL,
        Age INT NOT NULL CHECK(Age >= 0 AND Age <= 150) DEFAULT(0),
        ClassId INT,
        FOREIGN KEY (ClassId) REFERENCES T_Class(Id) ON UPDATE NO ACTION ON DELETE CASCADE
)
GO

-- 执行记录插入操作
INSERT INTO T_Class VALUES ('初一一班')
INSERT INTO T_Class VALUES ('初一二班')
INSERT INTO T_Class VALUES ('初一三班')
GO

-- 执行插入记录操作
INSERT INTO T_Student VALUES ('小明',20,1)
INSERT INTO T_Student VALUES ('小红',21,2)
INSERT INTO T_Student VALUES ('小花',22,3)
INSERT INTO T_Student VALUES ('小兰',23,2)
INSERT INTO T_Student VALUES ('小白',24,3)
GO

-- 执行更新操作
UPDATE T_Student SET ClassId = 1 WHERE Name = '小白' AND ClassId = 3
GO

-- 执行删除操作
UPDATE T_Student SET ClassId = NULL WHERE Name = '小白'
GO
DELETE FROM T_Student WHERE Name = '小白'
GO

-- 执行查询操作
IF (EXISTS(SELECT * FROM sys.objects WHERE name = 'usp_query'))
BEGIN
        PRINT '相关存储过程已经存在......'
        DROP PROC usp_query
END
GO

-- 创建存储过程
CREATE PROC usp_query
        @Top INT = 0,
        @names NVARCHAR(255) OUTPUT
AS
BEGIN
        -- 定义一个游标
        PRINT '@Top = ' + CAST(@Top AS NVARCHAR(50))
        DECLARE MyCursor CURSOR LOCAL SCROLL
        FOR SELECT Top(@Top) s.Name AS 学生姓名, c.Name AS '班级名称' FROM T_Student s LEFT JOIN T_Class c ON c.Id = s.ClassId
        -- 打开游标
        OPEN MyCursor
        -- 读取游标
        DECLARE @StudentName NVARCHAR(50)
        DECLARE @ClassName NVARCHAR(50)
        DECLARE @TempStr NVARCHAR(50)
        FETCH FIRST FROM MyCursor INTO @StudentName , @ClassName
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
                PRINT '学生名称:' + @StudentName + '|' + '班级名称:' + @ClassName
                SET @TempStr = '[' + @StudentName + '|' + @ClassName + ']'
                PRINT '临时文本:' + @TempStr
                SET @Names = @TempStr + @Names
                PRINT '------------------------------------------------------------'
                PRINT '姓名数据:' + @Names
                SET @Names = @Names + @TempStr
                SET @TempStr = ''
                FETCH NEXT FROM MyCursor INTO @StudentName,@ClassName
        END
        -- 关闭游标
        CLOSE MyCursor
        -- 释放游标
        DEALLOCATE MyCursor
        -- 设置返回
        RETURN 0
END
GO

-- 执行存储过程
DECLARE @returnResult INT
DECLARE @outputResult NVARCHAR(255)
EXEC @returnResult = usp_query 3 , @outputResult OUTPUT
SELECT @returnResult 返回结果 , @outputResult 输出结果
GO


为什么最后的结果为 NULL:

akjarjash 发表于 2020-12-2 15:32

我的 SQL 语句中的DECLARE @Names 是大写的不过这里显示成了 @names

clove 发表于 2020-12-2 16:27

@Names默认值是NULL,而 NULL+任意内容都是NULL

leimingx 发表于 2020-12-2 16:31

你好,请问有用过Cimplicity与SQL2014之间通讯吗{:1_919:}

renxiaofeixia 发表于 2020-12-2 16:44

clove 发表于 2020-12-2 16:27
@Names默认值是NULL,而 NULL+任意内容都是NULL

这个说的对

renxiaofeixia 发表于 2020-12-2 16:45

这样 isnull(变量1,'')+isnull(变量2,'')

理工精英 发表于 2020-12-2 16:47

renxiaofeixia 发表于 2020-12-2 16:45
这样 isnull(变量1,'')+isnull(变量2,'')

支持,一定要非空判断

akjarjash 发表于 2020-12-2 17:16

renxiaofeixia 发表于 2020-12-2 16:45
这样 isnull(变量1,'')+isnull(变量2,'')

嗯嗯 多谢你{:1_921:}

akjarjash 发表于 2020-12-2 17:17

leimingx 发表于 2020-12-2 16:31
你好,请问有用过Cimplicity与SQL2014之间通讯吗

没有呢,我 SQL 一直都是使用的 SQL Server 2008 R2

clove 发表于 2020-12-3 12:52

如果你是练手也就罢了,不建议在存储中写DDL,而且这个业务这么简单也没必要用存储
页: [1] 2
查看完整版本: SQL Server 数据库 T-SQL 存储过程中如何将两个 nvarchar 值相加的问题?