这是SS 2005.
为什么我只有4000个字符而不是8000个?
它在4000处截断字符串@ SQL1.
ALTER PROCEDURE sp_AlloctionReport(
@where NVARCHAR(1000),
@alldate NVARCHAR(200),
@alldateprevweek NVARCHAR(200))
AS
DECLARE @SQL1 NVARCHAR(Max)
SET @SQL1 = 'SELECT DISTINCT VenueInfo.VenueID, VenueInfo.VenueName, VenuePanels.PanelID,
VenueInfo.CompanyName, VenuePanels.ProductCode, VenuePanels.MF, VenueInfo.Address1,
VenueInfo.Address2, '' As AllocationDate, '' As AbbreviationCode, VenueInfo.Suburb, VenueInfo.Route, VenueInfo.ContactFirstName,
VenueInfo.ContactLastName, VenueInfo.SuitableTime, VenueInfo.OldVenueName,
VenueCategories.Category, VenueInfo.Phone, VenuePanels.Location, VenuePanels.Comment,
[VenueCategories].[Category] + '' Allocations'' AS ReportHeader,
ljs.AbbreviationCode AS PrevWeekCampaign
FROM (((VenueInfo INNER JOIN VenuePanels ON VenueInfo.VenueID = VenuePanels.VenueID)
INNER JOIN VenueCategories ON VenueInfo.CategoryID = VenueCategories.CategoryID)
LEFT JOIN (SELECT CampaignProductions.AbbreviationCode, VenuePanels.PanelID, CampaignAllocations.AllocationDate
FROM (((VenueInfo …Run Code Online (Sandbox Code Playgroud) 我想将一个表的所有行插入到另一个表中,并且我还想将一个nvarchar字段转换为bigint,但是当我使用convert(bigint, col1)SQL Server时显示错误:
将数据类型nvarchar转换为bigint时出错
我该如何解决这个问题?
我们正在构建一个由我们使用JDBC(驱动程序ojdbc6.jar和orai18n.jar)访问的Oracle数据库支持的Java应用程序.数据库模式主要使用NVARCHAR2数据类型存储文本列.
该JDBC文档的JDBC ResultSet说,getNString()尤其用于与NCHAR,NVARCHAR等数据类型使用,但目前我们只使用getString().
这似乎工作正常,所以我想知道为什么我应该使用getNString()而不是getString().是getString()要启动失败如果非ASCII字符输入,或者是哪个方法,我应该使用Oracle JDBC驱动程序无动于衷?
编辑:似乎它可能依赖于数据库:SQL Server似乎不介意您使用哪个,具体取决于连接参数.有没有人有关于Oracle的任何具体信息?
我想做这样的事......
public static List<string> GetAttachmentKeyList()
{
DataClassesDataContext dc = new DataClassesDataContext();
List<string> list = from a in dc.Attachments
select a.Att_Key.ToString().ToList();
return list;
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio说......
无法将类型'System.Linq.IQueryable>'隐式转换为'System.Collections.Generic.List'.存在显式转换(您是否错过了演员?)
什么是正确的语法???
我今天在SQL Server(2008R2和2012)中遇到了一个非常奇怪的问题.我正在尝试使用串联和select语句来构建字符串.
我找到了解决方法,但我真的很想了解这里发生了什么以及为什么它没有给我预期的结果.有人可以向我解释一下吗?
http://sqlfiddle.com/#!6/7438a/1
根据要求,这里的代码也是:
-- base table
create table bla (
[id] int identity(1,1) primary key,
[priority] int,
[msg] nvarchar(max),
[autofix] bit
)
-- table without primary key on id column
create table bla2 (
[id] int identity(1,1),
[priority] int,
[msg] nvarchar(max),
[autofix] bit
)
-- table with nvarchar(1000) instead of max
create table bla3 (
[id] int identity(1,1) primary key,
[priority] int,
[msg] nvarchar(1000),
[autofix] bit
)
-- fill the three tables with the same values …Run Code Online (Sandbox Code Playgroud) 我试图将表中的TIMESTAMP字段转换为字符串,以便它可以作为动态SQL的一部分打印或执行.SSMS能够做到这一点,因此必须有一个内置的方法来做到这一点.但是,我无法使用T-SQL工作.
以下正确显示表结果:
SELECT TOP 1 RowVersion FROM MyTable
Run Code Online (Sandbox Code Playgroud)
它表明0x00000000288D17AE.但是,我需要将结果作为更大字符串的一部分.
DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(BINARY(8), RowVersion) FROM MyTable)
PRINT(@res)
Run Code Online (Sandbox Code Playgroud)
这会产生错误: The data types varchar and binary are incompatible in the add operator
DECLARE @res VARCHAR(MAX) = (SELECT TOP 1 'test' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable)
PRINT(@res)
Run Code Online (Sandbox Code Playgroud)
这导致垃圾字符: test (®
实际上,空格只是空字符并终止字符串以便运行动态SQL EXEC().
DECLARE @sql VARCHAR(MAX) = 'SELECT TOP 1 ''test'' + CONVERT(VARCHAR(MAX), RowVersion) FROM MyTable'
EXEC (@sql)
Run Code Online (Sandbox Code Playgroud)
这只显示一个带有"test"一词的表格结果.动态SQL中"test"之后的所有内容都被截断,因为该CONVERT函数首先返回终止空字符.
显然,我想要的结果字符串是"test0x000000000000288D17AE"甚至是十进制等值,在这种情况下将是"test680335278".
任何想法将不胜感激.
请考虑下表,其中一列的类型为nullable NVARCHAR:
CREATE TABLE CHARACTER_SET_MISMATCH_TEST (
ID NUMBER(10) NOT NULL,
VALUE NVARCHAR2(32)
);
Run Code Online (Sandbox Code Playgroud)
现在,我想使用多行INSERT(带子查询)语法将多个数据元组插入到此表中:
INSERT
INTO CHARACTER_SET_MISMATCH_TEST (ID, VALUE)
SELECT ?, ? FROM DUAL
UNION ALL
SELECT ?, ? FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
如果NVARCHAR值是两者NULL都是非NULL,或者两者都是非的,那么一切都运行正常,我确实插入了2行.但是,如果我在一个单独的混合NULL和非NULL值PreparedStatement,我立即收到一个ORA-12704: character set mismatch错误:
java.sql.SQLException: ORA-12704: character set mismatch
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:452)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:400)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:884)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:471)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:199)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:535)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:238)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1385)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1709)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4364)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:4531)
at …Run Code Online (Sandbox Code Playgroud) 假设以下定义:
/// <summary>
/// Replaces each occurrence of sPattern in sInput with sReplace. This is done
/// with the CLR:
/// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace).
/// The result of the replacement is the return value.
/// </summary>
[SqlFunction(IsDeterministic = true)]
public static SqlString FRegexReplace(string sInput, string sPattern,
string sReplace)
{
return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace);
}
Run Code Online (Sandbox Code Playgroud)
在一个传递nvarchar(max)值sInput具有长度> 4000将导致被截断的值(即,在调用此UDF的结果是nvarchar(4000)相对于nvarchar(max).
我想知道在SQL Server 2008中将NVARCHAR字段设置为MAX而不是特定大小会产生什么影响,并限制应用程序逻辑的输入.那么,这些是一个糟糕的设计实践吗?
我想创建一个视图,它将显示由不同类型字段连接的两个表的信息.一个字段是nvarchar,另一个是int.我知道我需要在另一种类型中转换一种类型,但不知道该怎么做.任何帮助将不胜感激.
SELECT dbo.co.co_num, dbo.pck_hdr.weight, dbo.STR_ShipTrack.TrackingNumber
FROM dbo.co
INNER JOIN dbo.pck_hdr ON dbo.co.co_num = dbo.pck_hdr.co_num INNER JOIN dbo.STR_ShipTrack ON dbo.pck_hdr.pack_num = dbo.STR_ShipTrack.Reference1
Run Code Online (Sandbox Code Playgroud)